黑马程序员技术交流社区
标题:
反射:List接口的动态代理演示
[打印本页]
作者:
fmi110
时间:
2015-10-7 22:01
标题:
反射:List接口的动态代理演示
Proxy.newProxyInstance()返回的只能是接口,即代理对象所实现的接口
package demo.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;
public class ProxyOfArrayListDemo {
/**
* 23、 写一个 ArrayList 类的代理,实现和 ArrayList 类中完全相同的功能,
* 并可以计算 每个方法运行的时间。
*/
public static void main(String[] args) {
ArrayList<String> al = new ArrayList<String>();
List proxy = (List)Proxy.newProxyInstance(al.getClass().getClassLoader(),
al.getClass().getInterfaces(),new MyInvocationHandler1(al));
proxy.add("Hello java");
proxy.remove(0);
}
}
class MyInvocationHandler1 implements InvocationHandler{
private Object obj;
public MyInvocationHandler1(Object obj) {
super();
this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Long l1 = System.currentTimeMillis();
System.out.println("size of args : "+args.length +"..args[0] = "+args[0]);
System.out.println("method : "+method);
System.out.println("obj = "+obj);
Object result = method.invoke(obj, args);
System.out.println("result = "+result);
Long l2 = System.currentTimeMillis();
System.out.println(l2-l1);
return result;
}
}
复制代码
size of args : 1..args[0] = Hello java
method : public abstract boolean java.util.List.add(java.lang.Object)
obj = []
result = true
1
size of args : 1..args[0] = 0
method : public abstract java.lang.Object java.util.List.remove(int)
obj = [Hello java]
result = Hello java
0
复制代码
作者:
fmi110
时间:
2015-10-7 23:06
一个典型的动态代理创建对象过程可分为以下四个步骤:
1、通过实现InvocationHandler接口创建自己的调用处理器 IvocationHandler handler = new InvocationHandlerImpl(...);
2、通过为Proxy类指定ClassLoader对象和一组interface创建动态代理类
Class clazz = Proxy.getProxyClass(classLoader,new Class[]{...});
3、通过反射机制获取动态代理类的构造函数,其参数类型是调用处理器接口类型
Constructor constructor = clazz.getConstructor(new Class[]{InvocationHandler.class});
4、通过构造函数创建代理类实例,此时需将调用处理器对象作为参数被传入
Interface Proxy = (Interface)constructor.newInstance(new Object[] (handler));
为了简化对象创建过程,Proxy类中的newInstance方法封装了2~4,只需两步即可完成代理对象的创建。
生成的ProxySubject继承Proxy类实现Subject接口,实现的Subject的方法实际调用处理器的invoke方法,而invoke方法利用反射调用的是被代理对象的的方法(Object result=method.invoke(proxied,args))
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2