代码没上去,不好意思。
首先是什么时候用到代理?
就是在已有一个类的情况下,你需要在这个类的方法上,添加其他的功能,那么你就可以用到代理。
你可以用另外一个方法(其实就是InvocationHandler的invoke方法)把目标类的方法封装起来,然后再这个方法的前后,添加上代码实现你想实现的功能,其实这就是InvocationHandler要实现的功能。
Proxy.newProxyInstance方法返回的就是一个指定接口的代理类实例。
举个例子应该更清楚一些:
- <P>Collection proxy3 =(Collection)Proxy.newProxyInstance(Collection.class.getClassLoader(),
- new Class[]{Collection.class},
- new InvocationHandler(){
- ArrayList target = new ArrayList();
- public Object invoke(Object proxy, Method method,
- Object[] args) throws Throwable {
- long beginTime = System.currentTimeMillis();//①</P>
- <P>Object retVal = method.invoke(target, args);
- long endTime = System.currentTimeMillis();//②
- System.out.println(method.getName()+" running time is "+(endTime-beginTime));//③
- return retVal;
- }
- });
- //执行一次proxy3的方法,就会执行一次InvocationHandler的invoke方法
- proxy3.add("zxx");//返回值就是invoke方法的返回值</P>
复制代码 proxy3.add("zxx");//这行代码有三个元素,proxy3、add、"zxx"。
执行这句代码的时候,proxy3传给InvocationHandler的invoke方法的第一个参数Object proxy,
add传给第二个参数Method method,"zxx"传给第三个参数Object[] args。这样InvocationHandler才会知道,是哪个代理调用的哪个方法,使用的是什么参数。
整段代码就相当于在ArrayList的add方法的前后加了①②③这三行代码,InvocationHandler的invoke方法返回的还是method.invoke(target, args);的返回值。
至于你说invoke的Object proxy参数没用到,因为这个invoke方法不是显示的去调用,我想应该是里面封装了吧。
|