本帖最后由 刘印12 于 2013-4-5 01:47 编辑
看我这个解释 你最好复制到写java代码的应用软件上,能解释的我都在上面标示了
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 ListProxy {
public static void main(String[] args) throws Exception {//相信主函数里面的东西你是能看的懂的
List<String> list = newList(String.class);
list.add("abc");
System.out.println(list);
}
@SuppressWarnings("unchecked")//这句话是处理安全问题的你不用管
public static <T> List<T> newList(Class<T> elementType) {//创建ArrayList的代理对象newList。。。。。
return (List<T>)Proxy.newProxyInstance(List.class.getClassLoader(), new Class[]{List.class}, new InvocationHandler() {
/*
这个地方用到了Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)的这个方法
返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。
参数: loader - 定义代理类的类加载器 =======
List.class.getClassLoader() 返回该类的类加载器。
interfaces - 代理类要实现的接口列表===== new Class[]{List.class},
指派方法调用的调用处理程序//它是一个接口要定义一个方法覆盖它的invoke()方法
*/
private List<T> realList = new ArrayList<T>();//创建ArrayList的对象
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
long start = System.nanoTime();//System.nanoTime()返回最准确的可用系统计时器的当前值(Long类型的),
//以毫微秒为单位。。。。。这句就是返回代理对象开始调用方法时所用的时间
Object ret = method.invoke(realList, args);
/*
method.invoke(Object obj, Object... args)
对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
参数: obj - 从中调用底层方法的对象
args - 用于方法调用的参数
返回: 使用参数 args 在 obj 上指派该对象所表示方法的结果
*/
long end = System.nanoTime();//这句返回的是代理对象结束运行时总共的用时
System.out.println("调用" + method.getName() + "耗时:" + (end - start) + "纳秒");
return ret;
}
});
}
}
|