转自 http://blog.youkuaiyun.com/luanlouis/article/details/24589193
cglib 生成动态代理类的机制----通过类继承:
JDK中提供的生成动态代理类的机制有个鲜明的特点是: 某个类必须有实现的接口,而生成的代理类也只能代理某个类接口定义的方法,比如:如果上面例子的ElectricCar实现了继承自两个接口的方法外,另外实现了方法bee() ,则在产生的动态代理类中不会有这个方法了!更极端的情况是:如果某个类没有实现接口,那么这个类就不能同JDK产生动态代理了!
幸好我们有cglib。“CGLIB(Code Generation Library),是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。”
cglib 创建某个类A的动态代理类的模式是:
1. 查找A上的所有非final 的public类型的方法定义;
2. 将这些方法的定义转换成字节码;
3. 将组成的字节码转换成相应的代理的class对象;
4. 实现 MethodInterceptor接口,用来处理 对代理类上所有方法的请求(这个接口和JDK动态代理InvocationHandler的功能和角色是一样的)
一个有趣的例子:定义一个Programmer类,一个Hacker类
- package samples;
-
-
-
-
- public class Programmer {
-
- public void code()
- {
- System.out.println("I'm a Programmer,Just Coding.....");
- }
- }
- package samples;
-
- import java.lang.reflect.Method;
-
- import net.sf.cglib.proxy.MethodInterceptor;
- import net.sf.cglib.proxy.MethodProxy;
-
-
-
- public class Hacker implements MethodInterceptor {
- @Override
- public Object intercept(Object obj, Method method, Object[] args,
- MethodProxy proxy) throws Throwable {
- System.out.println("**** I am a hacker,Let's see what the poor programmer is doing Now...");
- proxy.invokeSuper(obj, args);
- System.out.println("**** Oh,what a poor programmer.....");
- return null;
- }
-
- }
- package samples;
-
- import net.sf.cglib.proxy.Enhancer;
-
- public class Test {
-
- public static void main(String[] args) {
- Programmer progammer = new Programmer();
-
- Hacker hacker = new Hacker();
-
- Enhancer enhancer = new Enhancer();
-
- enhancer.setSuperclass(progammer.getClass());
-
- enhancer.setCallback(hacker);
- Programmer proxy =(Programmer)enhancer.create();
- proxy.code();
-
- }
- }
程序执行结果:
让我们看看通过cglib生成的class文件内容:
- package samples;
-
- import java.lang.reflect.Method;
- import net.sf.cglib.core.ReflectUtils;
- import net.sf.cglib.core.Signature;
- import net.sf.cglib.proxy.Callback;
- import net.sf.cglib.proxy.Factory;
- import net.sf.cglib.proxy.MethodInterceptor;
- import net.sf.cglib.proxy.MethodProxy;
-
- public class Programmer
EnhancerByCGLIB
fa7aa2cd extends Programmer - implements Factory
- {
-
- private MethodInterceptor CGLIB$CALLBACK_0;
-
- public final void code()
- {
- MethodInterceptor tmp4_1 = this.CGLIB$CALLBACK_0;
- if (tmp4_1 == null)
- {
- tmp4_1;
- CGLIB$BIND_CALLBACKS(this);
- }
- if (this.CGLIB$CALLBACK_0 != null)
- return;
-
- super.code();
- }
-
- }