我们在上一篇中使用jdk实现的动态代理。但是大家有没有发现使用jdk生成代理对象时有弊端,什么样的弊端呢?
如果我的委托类没有实现接口,能使用jdk的动态代理吗?
看过源码的都知道当然是不行的。那怎么办?
我们可以使用cglib生成动态代理
cglib:Code Generation Library是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口.
CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类.
使用步骤:
1、创建委托类
2、创建代理的生成工具类
1、实现接口,MethodInterceptor
2、声明代理对象并实例化
3、创建生成代理对象的方法
4、重写接口中的拦截方法
3、测试
委托类:
public class Examinee {
private String name;//姓名
//考试
public void exam() {
System.out.println(name+",正在考试……");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
代理类的生成工具类:
//1、创建类实现接口
public class CglibProxyFactory implements MethodInterceptor {
//2、声明委托类对象并完成实例化
private Object target;//目标类对象
//通过构造方法完成注入
public CglibProxyFactory(Object obj){
target=obj;
}
//3、创建代理类对象
public Object createProxy() {
//创建代理类的核心类对象
Enhancer enhancer=new Enhancer();
//设置父类
enhancer.setSuperclass(target.getClass());
//设置回调函数
enhancer.setCallback(this);
//获取代理对象
return enhancer.create();
}
//4、拦截方法处理:回调函数
/**
* 参数说明
* 1、生成的代理类对象
* 2、要执行的方法对象
* 3、实际参数对象
* 4、要执行的方法的代理对象*/
@Override
public Object intercept(Object proxy, Method method, Object[] arg0, MethodProxy methodProxy) throws Throwable {
System.out.println("抢手进场,代替");
//这样写也可以
Object res=method.invoke(target, arg0);//执行真正的方法
//这样写也可以
//Object res=methodProxy.invokeSuper(proxy, arg0);
return res;
}
}
CGLIB的实现就是让代理类直接继承我们的委托类,所以无论委托类有没有接口的实现都是无所谓的。
版权声明:本文为u014332200原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。