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是子类中的方法,形成了一个递归(死循环)造成的?等某天想看了在研究其中的源码,现在先放着。