黑马程序员技术交流社区
标题:
关于动态代理,谁能详细说说一个具体流程,还是有些模糊
[打印本页]
作者:
王金科
时间:
2012-9-13 20:56
标题:
关于动态代理,谁能详细说说一个具体流程,还是有些模糊
本帖最后由 王金科 于 2012-9-14 01:00 编辑
public class ProxyDemo {
public static void main(String[] args) throws Exception{
final ArrayList target = new ArrayList<>();
Collection proxy4 = (Collection)getProxy(target,new MyAdvice());
proxy4.add("asd");//这句话的具体流程是怎么样子的?
proxy4.clear();
System.out.println(String.class.getInterfaces());
}
private static Object getProxy(final Object target,final Advice advice) {
Object proxy4 = Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler(){
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
advice.beforeMethod(method);
Object retVal = method.invoke(target, args);
advice.afterMethod(method);
return retVal;
}
});
return proxy4;
}
}
复制代码
后面加注释的那句话,具体流程是怎么样子的?谁能给我详细说说?
作者:
杨震
时间:
2012-9-13 21:46
流程其实张老师视频里面画的有,代理对象执行add方法,实际上等于效于执行了InvocationHandler里面的invoke方法,invoke(Object proxy, Method method, Object[] args)
并且此时invoke的三个参数proxy就是调用add方法的代理对象本身,Method就是add,args就是你传给add的参数"asd";
同理:执行clear方法的时候,也等效于执行了InvocationHandler里面的invoke方法,invoke(Object proxy, Method method, Object[] args),只是此时传入invokde的三个参数有变化,proxy没有变,仍然是代理对象本身;Method此时变成了clear;args仍然是你传给clear的参数,但此时clear没有参数,所以args也为空.
也就是讲,代理对象每调用一个方法,实际上是在调用invoke,只是调用不同的方法传入invoke的参数不同,但proxy永远是代理对象本身,Method就是代理对象调用的方法,args就是你传给代理对象调用的方法的参数
作者:
李菁
时间:
2012-9-13 23:17
04.final ArrayList target = new ArrayList<>(); 为这个动态类指定目标
05.Collection proxy4 = (Collection)getProxy(target,new MyAdvice()); 创建代理对象
06.proxy4.add("asd");//这句话的具体流程是怎么样子的? 这句话就是调用你代理对象的add方法,向里面加入"asd"
作者:
王金科
时间:
2012-9-14 00:59
谢谢大家的慷慨解答
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2