黑马程序员技术交流社区

标题: InvocationHandler中的语句究竟什么时候执行的? [打印本页]

作者: 胡建彪    时间: 2012-10-10 15:04
标题: InvocationHandler中的语句究竟什么时候执行的?
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Collection;

public class ProxyDemo {

    public static void main(String[] args) throws Exception{
         Collection  proxy3 = (Collection)Proxy.newProxyInstance(
                Collection.class.getClassLoader(), // 第一个参数 类加载器
                new Class[]{Collection.class},// 第二个参数  接口的数组, 注意是 大括号。
                new InvocationHandler(){     // 第三个参数 handler的实例对象
                    ArrayList  target =new ArrayList();
                    public Object invoke(Object proxy, Method method, Object[] args)
                        throws Throwable {
                        
                        long beginTime = System.currentTimeMillis();
                        Object retVal = method.invoke(target, args);
                        long  endTime = System.currentTimeMillis();
                        System.out.println(method.getName()+"running  time of"+(endTime-beginTime));
                        return retVal;
                    }
               
                });
               
        // 每调用一次add 都会调用一次InvocationHandler的invoke方法,代理对象,代理对象的方法,代理对象的方法参数这三要素传递给invoke。
        proxy3.add("zxx");
        proxy3.add("bxd");
        proxy3.add("lhm");
        System.out.println(proxy3.size());   
    }
}
new InvocationHandler(){}究竟是如何别调用的 ? 什么时候执行的?


作者: 张忠豹    时间: 2012-10-10 19:49
本帖最后由 张忠豹 于 2012-10-10 19:59 编辑

//new InvocationHandler(){}究竟是如何别调用的 ? 什么时候执行的?
//记住Proxy仅仅只是一个代理,他要将请求转发。转发处理的方法就是invoke
/**在JavaAPI文档中说:每个代理实例都具有一个关联的调用处理程序。对代理实例调用方法时,
将对方法调用进行编码并将其指派到它的调用处理程序的 invoke 方法。
这句话结合本道程序意思是:只要你调用proxy3的方法,就会将该方法的处理交给InvocationHandler
中的invoke方法处理。
//invoke方法返回的值retVal就是add、size这些方法返回的值,有时候是boolean的,有时候是int的……
proxy:表示那个代理在调用invoke方法
method:表示使用的方法是什么,这儿是三次add,一次size
args:方法传递的参数,调用三次add,传递的参数为zxx、bxd、lhm,调用size时传递的参数是void


作者: 胡建彪    时间: 2012-10-10 21:21
张忠豹 发表于 2012-10-10 19:49
//new InvocationHandler(){}究竟是如何别调用的 ? 什么时候执行的?
//记住Proxy仅仅只是一个代理,他要 ...

I See,Thanks  for replying!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2