1.JDK代理对象原理
需要:
1.目标接口(普通)
2.目标接口的实现类(即目标对象)
3.代理对象(方法增强使用)
4.抽出一个增强类,实现具体增强方法
2.其它都很简单,重点在代理对象的具体实现上,先贴代码
final Target target = new Target();
final Advice advice = new Advice();
TargetInterface targetInterface = (TargetInterface) Proxy.newProxyInstance(
//目标对象类加载器
target.getClass().getClassLoader(),
//目标对象相同的接口字节码对象数组
target.getClass().getInterfaces(),
//
new InvocationHandler() {
//调用代理对象的任何方法,实际上执行的都是invoke方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
advice.before();//前置增强
Object invoke = method.invoke(target, args);//执行目标方法
advice.after();//后置增强
return invoke;
}
}
);
targetInterface.save();
逐行解释:
1.需要一个目标对象,用于代理实例方法的使用
2.一个增强类,内部包含了增强方法
3.使用Proxy新建一个代理实例对象内部包含了三个参数,由于创建出来的是一个代理对象,有(1)图可知,代理对象与Target目标对象为兄弟关系,根据JAVA多态特性,子类引用指向父类,所以用父类接收{
3.1 目标对象类加载器
3.2 目标对象相同的接口字节码对象数组
3.3 代理的具体实现{
3.3.1 重写 invoke方法,由于调用代理对象的任何方法,实际上执行的都是invoke方法{
3.3.1.1 在方法未加载时增强
3.3.1.2 方法执行时,method为代理对象方法,代理谁就代表谁,invoke为执行,内部包含两个参数(1.有这个方法本身是一个代理对象,我们可以知道,此处并非递归,所以不会是自己调用自己,就可以得出这个proxy为被代理的对象,2.为方法本身传递的参数)
3.3.1.3 在方法被加载后增强
3.3.1.4 返回一个增强后的方法
}
}
}
4.方法被增强后的执行
这一块老忘,有时间就就来看看!!