动态代理
动态代理
1、动态代理(dynamic proxy)
在运行时候,在JVM中动态 针对某一个类或者接口,产生一个对象
特点:在不改变原有的类或者方法的基础上实现对类或者方法的增强
2、实现方法
- 方法一:java的jdk中提供了一个类 Proxy静态方法 newProxyInstance(参数1,参数2,参数3)
- 参数1:类加载器:负责加载.class文件到jvm内存
- 方式二:Cglib中提供了一个类 Enhancer(英文:增强),方法 setSupperClass(...)
3、为什么要使用动态代理
增强一个类,在基础阶段,只有一种手段 就是继承!继承来实现类增强是有缺陷的,会造成子类爆炸,而且对方法破坏!于是动态代理就产生了,在不改变原有的代码的基础上对代码进行增强。
开发步骤:
- 必须要先定义一个接口
- 基于接口定义一个实现类
- 基于Proxy产生代理对象
基于JDK实现动态代理
在JDK中,实现类必须要实现一个接口,才能完成动态代理
接口
package com.hmall.jdk;
public interface Cline {
void den();
}
实现类
package com.hmall.jdk;
public class JdkCline implements Cline{
@Override
public void den() {
System.out.println("在跳舞");
}
}
动态代理类
package com.hmall.jdk;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JdkClineTest {
public static void main(String[] args) {
ClassLoader loader = Cline.class.getClassLoader();
Class<?>[] interfaces = JdkCline.class.getInterfaces();
InvocationHandler invocation = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("在唱歌");
Object invoke = method.invoke(new JdkCline(), args);
System.out.println("退出历史舞台");
return invoke;
}
};
Cline instance = (Cline) Proxy.newProxyInstance(loader, interfaces, invocation);
instance.den();
}
}
编译效果:

基于Cglib实现动态代理
实现类
package com.hmall.cglibProxy;
public class Cglib {
public void den(){
System.out.println("我在唱歌");
}
}
动态代理类
package com.hmall.cglibProxy;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.InvocationHandler;
import java.lang.reflect.Method;
public class CglibClient {
public static void main(String[] args) {
//创建Enhancer对象
Enhancer enhancer = new Enhancer();
//设置生成代理对象父类
enhancer.setSuperclass(Cglib.class);
//设置回调
enhancer.setCallback(new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("鞠躬!!!!!!!!!!!");
Object invoke = method.invoke(new Cglib(), args);
System.out.println("挥手~~~~~~~~~~~~~~~~~~~~~~~~");
return invoke;
}
});
//创建代理对象
Cglib o = (Cglib) enhancer.create();
o.den();
}
}
编译效果


浙公网安备 33010602011771号