什么是动态代理?
实现某个接口方法的类A,要在不改变这个类代码的前提下,在类执行
方法的前后加入一些代码(日志、切面、事务),这时候就需要一个代理对象Proxy(
也实现这个接口方法),在方法中执行这个类A的方法,顺便在方法前后加代码
(日志、切面、事务)
核心类:Proxy
核心代码:
//要被代理的类
Tank tank = new Tank();//实例化类XXX接口
//得到代理的实例对象
//1.类加载器 2.代理对象实例化的接口 3.handler负责写代理的业务逻辑
XXX xxx = (XXX)Proxy.newProxyInstance(ClassLoader classLoader,
Class<?>[] interfaces,
InvocationHandler invocationHandler);
//执行代理实例的方法,实现日志、事务等功能
xxx.move();
interfaces通过反射得到接口的每个方法
invocationHandler中的invoke(Method m)方法可以动态对某一个方法进行处理
XXXInvocationHandler.java
public class XXXInvocationHandler implements InvocationHandler{
Object target;//被代理的对象
public XXXInvocationHandler(Object o){
super();
this.target = o;
}
@Overrride
invoke(Object target,Method method){
//前面写方法执行前的代理逻辑
method.invoke(target);//调用被代理类的方法
//后面写方法执行后的代理逻辑
}
}
Proxy类中执行了什么操作?
通过执行newProxyInstance();方法
1.选择对应的类加载器将class二进制文件(
拼接字符串得到)载入JVM内存
2.得到用户代理对象实现的接口-----反射----
得到接口的方法
3.执行InvocationHandler的
invoke方法(包含被代理类的方法+添加的日志)-----实现动态代理
实现方法:JDK Compiler API或CGLIB ASM直接生成class二进制文件
作用:日志、事务、权限控制