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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© fmi110 高级黑马   /  2015-10-7 22:01  /  1045 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Proxy.newProxyInstance()返回的只能是接口,即代理对象所实现的接口
  1. package demo.proxy;

  2. import java.lang.reflect.InvocationHandler;
  3. import java.lang.reflect.Method;
  4. import java.lang.reflect.Proxy;
  5. import java.util.ArrayList;
  6. import java.util.List;

  7. public class ProxyOfArrayListDemo {

  8.         /**
  9.          * 23、 写一个 ArrayList 类的代理,实现和 ArrayList 类中完全相同的功能,
  10.          * 并可以计算 每个方法运行的时间。
  11.          */
  12.         public static void main(String[] args) {
  13.                 ArrayList<String> al = new ArrayList<String>();
  14.                 List proxy = (List)Proxy.newProxyInstance(al.getClass().getClassLoader(),
  15.                                 al.getClass().getInterfaces(),new MyInvocationHandler1(al));
  16.                 proxy.add("Hello java");
  17.                 proxy.remove(0);
  18.         }

  19. }
  20. class MyInvocationHandler1 implements InvocationHandler{
  21.         private Object obj;
  22.        
  23.         public MyInvocationHandler1(Object obj) {
  24.                 super();
  25.                 this.obj = obj;
  26.         }

  27.         @Override
  28.         public Object invoke(Object proxy, Method method, Object[] args)
  29.                         throws Throwable {
  30.                 Long l1 = System.currentTimeMillis();
  31.                 System.out.println("size of args : "+args.length +"..args[0] = "+args[0]);
  32.                 System.out.println("method : "+method);
  33.                 System.out.println("obj = "+obj);
  34.                 Object result = method.invoke(obj, args);
  35.                 System.out.println("result = "+result);
  36.                 Long l2 = System.currentTimeMillis();
  37.                 System.out.println(l2-l1);
  38.                 return result;
  39.         }
  40.        
  41. }
复制代码
  1. size of args : 1..args[0] = Hello java
  2. method : public abstract boolean java.util.List.add(java.lang.Object)
  3. obj = []
  4. result = true
  5. 1
  6. size of args : 1..args[0] = 0
  7. method : public abstract java.lang.Object java.util.List.remove(int)
  8. obj = [Hello java]
  9. result = Hello java
  10. 0
复制代码



1 个回复

倒序浏览
  1. 一个典型的动态代理创建对象过程可分为以下四个步骤:
  2. 1、通过实现InvocationHandler接口创建自己的调用处理器 IvocationHandler handler = new InvocationHandlerImpl(...);
  3. 2、通过为Proxy类指定ClassLoader对象和一组interface创建动态代理类
  4. Class clazz = Proxy.getProxyClass(classLoader,new Class[]{...});
  5. 3、通过反射机制获取动态代理类的构造函数,其参数类型是调用处理器接口类型
  6. Constructor constructor = clazz.getConstructor(new Class[]{InvocationHandler.class});
  7. 4、通过构造函数创建代理类实例,此时需将调用处理器对象作为参数被传入
  8. Interface Proxy = (Interface)constructor.newInstance(new Object[] (handler));
  9. 为了简化对象创建过程,Proxy类中的newInstance方法封装了2~4,只需两步即可完成代理对象的创建。
  10. 生成的ProxySubject继承Proxy类实现Subject接口,实现的Subject的方法实际调用处理器的invoke方法,而invoke方法利用反射调用的是被代理对象的的方法(Object result=method.invoke(proxied,args))
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马