上面一篇文章JDK动态代理的原理讲到Java内部的JDK动态代理的原理,这一集讲一下CGLIB的原理
CGLIB生成代理类的工厂:Enhancer
看demo
public class EnhancerFactoryTest {
/**
* 生成新的代理
* @param obj
* @return
*/
public static Object getEnhancher(Object obj) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(obj.getClass());
enhancer.setInterfaces(obj.getClass().getInterfaces());
MethodInterceptor callBack =new MyMethodInterceptor();
enhancer.setCallback(callBack);
enhancer.setUseFactory(false);
enhancer.setUseCache(true);
return enhancer.create();
}
}
public class MyMethodInterceptor implements MethodInterceptor {
/**
* 增强实现
* @param proxy
* @param method
* @param args
* @param methodProxy
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
beforeProxy();
Object result = methodProxy.invokeSuper(proxy, args);
afterProxy();
return result;
}
private void beforeProxy() {
System.out.println("before Enhancer");
}
private void afterProxy() {
System.out.println("after Enhancer");
}
}
public class SelfBean implements SelfInterface {
@Override
public String getName() {
System.out.println("selfBean");
return "this is SelfBean";
}
}
调用 EnhancerFactoryTest的getEnhancer()方法时生成新的Class
CGLIB较JDK复杂,生成了三个新的Class文件
真正的新代理对象是第二个
新的代理类有两个方法,CGLIB$getName$0()和getName()
两个方法实现不一样,第一个没有增强,直接调用了父类SelfBean的getName().第二个有增强,调用了MethodInterceptor的增强方法