本帖最后由 yuon11937 于 2014-5-21 08:54 编辑
你先要明白代理的作用是什么,当要给某些类的方法增加一些额外的功能时,我们可以通过创建另外一个代理类,在代理类中实现和另一个类的相同的这个方法,然后在代理类中增加额外的系统功能,当需要使用到系统功能时,调用该代理类的方法,也可以达到调用原来方法的目的,不需要系统功能时调用原来的类的方法。但是这样一来我们就要自己手动创建每个代理类,其实这也就是静态代理。Java中的Proxy类可以动态创建代理类,为已经存在的具有相同接口的目标类的每个方法增加一些额外的系统功能,核心之处其实就是反射,Proxy的getProxyClass()方法动态创建代理类,运行时JVM自动的生成代理类的.class字节码文件。这就不需要我们自己去编写代理类了。
- public class ProxyTest {
- public static void main(String[] args) throws Exception {
-
- Collection proxy3 = (Collection)Proxy.newProxyInstance(Collection.class.getClassLoader(),
- new Class[] {Collection.class},
- new InvocationHandler() {
- //创建目标类示例对象
- ArrayList target = new ArrayList();
- //重写invoke()方法,每次调用代理类时,都计算目标方法的运行时间
- @Override
- public Object invoke(Object proxy, Method method,
- Object[] args) throws Throwable {
- long begin = System.currentTimeMillis();
- Object retValue = method.invoke(target, args);
- long end = System.currentTimeMillis();
- System.out.println("++++" + (end - begin));
- return retValue;
- }
-
- });
-
- proxy3.add("abc");
- System.out.println(proxy3);//打印目标集合
- System.out.println(proxy3.getClass().getName());//com.sun.proxy.$Proxy0
- }
复制代码
目标类是ArrayList,Proxy3对象可以当做目标类的对象来使用,它里面的方法有目标类的方法,实现目标类的功能就可以只接通过代理对象调用这些方法,就可以实现,同时也实现了系统功能(计算方法时间)。你要对反射很明白就可以很好理解了。 |