java动态代理和cglib动态代理
动态代理应用广泛,Spring,Struts等框架很多功能是通过动态代理,或者进一步封装来实现的。 常见的动态代理模式实现有Java API提供的动态代理和第三方开源类库CGLIB动态代理。 Java API提供的动态代理是基于类反射实现的,用到的类有: java.lang.reflect.InvocationHandler; java.lang.reflect.Method; java.lang.reflect.Proxy; 其实现是通过Proxy类的 newProxyInstance() 方法产生代理对象。自定义动态代理类需要实现InvocationHandler接口,该接口只有一个invoke()方法。 CGLIB是通过生成java 字节码从而动态的产生代理对象,因此需要字节码解析处理的依赖asm类库,字节码动态生成的代理对象实际上是继承了真实主题类的。这种实现方式需要导入cglib和asm的类库。下面用到的例子是cglib-2.2.2.jar, asm-3.3.1.jar。cglib使用了 MethodInterceptor,其中的方法是intercept(),这是拦截的概念,很容易就想到了Struts2的拦截器。 比较之下,Java API提供的动态代理需要面向接口,产生代理对象,因此真实主题实现类必须实现了接口才可以。 而CGLIB不需要面向接口,可以代理简单类