参考:https://www.jianshu.com/p/cbd4c1ad8a75
上一篇我们利用jdk的动态代理实现了一个简单的注解处理器,可以自动给一个button添加指定的监听器.
但是jdk的动态代理有一个不足之处,就是他代理的类必须实现了一个接口,如果我们要代理的类就是一个类,没有实现接口,
那么jdk的动态代理就无能无力了,这个时候我们需要用到一个更为强大的工具cglib,他可以动态给要代理的类生成一个子类
由子类代替父类完成工作,并作一定的功能增强.
下面我们举一个简单的例子,我又一个类,他只负责打招呼
public class Hello { public void sayHello(){ System.out.println("hello,world"); } }
现在我在不改变这个类的基础上,想对他进行功能增强,应该怎么办?
肯定是使用代理啊,那Hello是个类,没有实现接口,我们只能用cglib,cglib是一个第三方的库,我们要先引进来
<dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.3.0</version> </dependency>
接下来我们要定义一个方法过滤器,对sayHello进行增强,其中
methodProxy.invokeSuper(obj, args);就是调用原来hello里的sayHello
import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; public class HelloMethodInterceptor implements MethodInterceptor { public Object intercept(Object obj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { System.out.println("log before method"); Object result = methodProxy.invokeSuper(obj, args); System.out.println("log after method"); return result; } }
然后我们写一个例子,测试下效果
import net.sf.cglib.proxy.Enhancer; public class HelloProxy { public static void main(String[] args) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(Hello.class); enhancer.setCallback(new HelloMethodInterceptor()); Hello proxy =(Hello) enhancer.create(); proxy.sayHello(); } }
输出
log before method hello,world log after method
事实证明,cglib已经完美实现了我们想要的功能.
对比jdk的动态代理可以发现:
cglib的MethodInterceptor就相当于jdk动态代理中的InvocationHandler
cglib中的Enhancer就相当jdk动态代理中的Proxy
用法基本相同,只不过jdk动态代理基于接口实现,cglib是基于子类继承父类.
//代理的静态实现,更像Proxy.newInstance Hello proxy2 =(Hello) Enhancer.create(Hello.class, new HelloMethodInterceptor()); proxy2.sayHello();
标签:java,CGLIB,jdk,代理,public,cglib,动态,Hello From: https://www.cnblogs.com/wangbin2188/p/17207718.html