A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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(){}究竟是如何别调用的 ? 什么时候执行的?

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1

查看全部评分

2 个回复

倒序浏览
本帖最后由 张忠豹 于 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

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
张忠豹 发表于 2012-10-10 19:49
//new InvocationHandler(){}究竟是如何别调用的 ? 什么时候执行的?
//记住Proxy仅仅只是一个代理,他要 ...

I See,Thanks  for replying!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马