Jdk动态代理的原理:被代理对象实现某个接口(前提),代理对象拦截被代理对象的方法调用,在其中可以全然抛弃被代理对象的方法实现而完成另外的功能,也可以在被代理对象方法调用的前后增加一些额外的功能。
动态代理的核心是生成代理对象,即 Proxy.newProxyInstance(classLoader, proxyInterface, handler)。
Person zhangsan = new Student("张三");
Person stuProxy = (Person) Proxy.newProxyInstance(Person.class.getClassLoader(),
new Class>[]{Person.class},
new StuInvocationHandler(zhangsan));
//
通过为Proxy类指定ClassLoader对象和一组interface创建动态代理类
Class clazz = Proxy.getProxyClass(classLoader,
new
Class[]{...});
//通过实现InvocationHandler接口创建调用处理器
IvocationHandler handler =
new
InvocationHandlerImpl(...);
//
通过反射机制获取动态代理类的构造函数,其参数类型是调用处理器接口类型
Constructor constructor = clazz.getConstructor(
new
Class[]{InvocationHandler.
class
});
//
通过构造函数创建代理类实例,此时需将调用处理器对象作为参数被传入
Interface Proxy = (Interface)constructor.newInstance(
new
Object[] (handler));
//
ProxyGenerator.generateProxyClass()方法属于sun.misc包下,Oracle并没有提供源代码,但是我们可以使用
JD-GUI这样的反编译软件打开jre\lib\rt.jar来一探究竟,以下是其核心代码的分析。
|
Proxy 的主要静态变量
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
创建的代理类 ProxySubject.class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
|
CGLib 动态代理
动态字节码生成。使用动态字节码生成技术实现AOP原理是在运行期间目标字节码加载后,生成目标类的子类,将切面逻辑加入到子类中,所以使用Cglib实现AOP不需要基于接口。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|