一、java动态代理
- 实现InvocationHandler接口,来创建自己的调用处理器;
- 为Proxy指定ClassLoader对象和一组interface来创建动态代理;
- 通过反射获得动态代理的构造函数,唯一参数类型为是调用处理器的接口类型;
- 构造函数创建代理类实例,构造时调用处理器对象作为参数被传入;
实例:
public class ProxyTest {
public static void main(String[] args) {
final X o = (X) Proxy.newProxyInstance(X.class.getClassLoader(), new Class[]{X.class}, new XIH<X>(new XImpl()));
o.a();
o.b();
}
static class XIH<T> implements InvocationHandler {
private T t;
XIH(T t) {
this.t = t;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("通知开始!");
final Object o = method.invoke(this.t, args);
System.out.println("通知结束!");
return o;
}
}
}
public interface X {
void a();
void b();
}
二、cglib
- 运行期间扩展Java类和实现java接口;
- 高性能、高质量的java生成类库;
- cglib封装asm,可以运行期间动态生成java类;
- cglib用于AOP,java的Proxy必须基于接口,cglib没有限制;
三、区别
java动态代理是利用反射机制生成一个利用代理接口的匿名类,在调用具体方法前调用InvocationHandler来处理;
cglib动态代理是使用asm开源包,加载代理对象类的class文件,修改其字节码生成子类进行处理;