cglib和Jdk的动态代理相比,它的优点是目标类不用实现一个接口。
代码实现:
目标类
package cglib; public class ClassHasNoInterface { public void method(){ System.out.println("建立自己的知识体系还是很重要的,尽管觉得麻烦"); } public void function(){ System.out.println("如果我只停留在使用的别人开发的工具阶段,那么再过5年我也对不起程序员这个称呼"); } }
代理类
package cglib; import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class CglibTs implements MethodInterceptor{ private Enhancer enhancer = new Enhancer(); public Object getProxy(Class clazz){ //生成指定类对象的子类,也就是重写类中的业务函数,在重写中加入intercept()函数而已。 enhancer.setSuperclass(clazz); //这里是回调函数,enhancer中肯定有个MethodInterceptor属性。 //回调函数是在setSuperclass中的那些重写的方法中调用---猜想 enhancer.setCallback(this); //创建这个子类对象 return enhancer.create(); } public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println(method.getName()+"执行之前做一些准备工作"); //一不小心写成下面被注释一行代码了。 StackOverflowError //Object result = method.invoke(obj, args); 想不通 Object result = proxy.invokeSuper(obj,args); System.out.println(method.getName()+"执行之后做一些准备的工作"); return result; } }
测试类:
package cglib; public class MainTest { public static void main(String[] args) { CglibTs ct = new CglibTs(); ClassHasNoInterface chni = (ClassHasNoInterface) ct.getProxy(ClassHasNoInterface.class); chni.method(); chni.function(); } }
这里对代理类中的method.invoke()出现内存溢出感到疑惑,会不是method是子类中的方法,形成了一个递归(死循环)造成的?等某天想看了在研究其中的源码,现在先放着。