JAVA代理模式之三动态代理CGLIB详解
来源:互联网 发布:男生长发 知乎 编辑:程序博客网 时间:2024/06/05 15:32
我们在上一篇中使用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的实现就是让代理类直接继承我们的委托类,所以无论委托类有没有接口的实现都是无所谓的。
阅读全文
0 0
- JAVA代理模式之三动态代理CGLIB详解
- java动态代理模式之Cglib动态代理机制
- 代理模式三(cglib动态代理)
- java代理(三)--cglib动态代理
- 代理模式之cglib动态代理
- 代理模式之cglib动态代理
- 代理模式之cglib动态代理
- java代理模式、动态代理(JDK,CGLIB)
- java 代理模式 CGLIB的动态代理
- Java代理模式 静态代理,动态代理,Cglib代理
- Java动态代理之CGLIB
- Java动态代理之CGLIB
- Java动态代理之cglib
- java 静态代理,jdk动态代理,CGLIB动态代理详解
- 代理模式-cglib动态代理
- Java代理模式(静态代理、Cglib动态代理)
- Java代理机制及动态代理和CGLIB代理详解
- cglib动态代理模式
- HDU 6043 KazaQ's Socks(周期)
- Rabbit MQ
- centos修改、保存文件的详细步骤
- 从一个死锁看mysql innodb的锁机制
- Java的21个技术点,你知道吗?
- JAVA代理模式之三动态代理CGLIB详解
- Qt 中SQL语句通配符
- solr suggest
- 将model转化为字典
- 二叉排序树创建、查找、删除
- ZSH使用
- Java中关于“unreachble code”的报错
- 事务和锁(共享锁,排他锁,乐观,悲观,死锁)
- What is batch_size?