本帖最后由 秦大忠 于 2013-10-21 11:52 编辑
解释代码中标记为?????????????????????????
的地方,为什么要睡眠十毫秒?
package qin.com;
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 Demo2 {
public static void main(String[] args) {
final ArrayList target = new ArrayList();
//开始创建一个ArrayList类的代理实例,将ArrayLIst强制转换成父类List
List proxy = (List) Proxy.newProxyInstance(
// 返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序
List.class.getClassLoader(),
//获取List的类加载器
ArrayList.class.getInterfaces(),
//获取需要指定的接口
new InvocationHandler() {
// InvotioncationHandler是一个调用处理器,当调用ArrayList中某个方法时,计算该方法的运行时间
//重写InvocationHandler中唯一的方法invoke()
public Object invoke(
Object proxy,
//在其上调用方法的代理实例
Method method,
//对应于在代理实例上调用的接口方法的 Method 实例,调用哪个方法,method对象就代表哪个方法
Object[] arr
//包含传入代理实例上方法调用的参数值的对象数组,将方法中调用的参数存入一个数组arr
) throws Throwable {
long beginTime = System.currentTimeMillis();
Thread.sleep(10);//???????????????????????????????????????????????????????????????????????
Object reVal = method.invoke(target, arr);
//该invoke方法时Method中的方法,而不是InvocationHandler中方法,带有arr参数的方法中,如果该
//方法完成,则将该方法的返回值返回给调用者,相当于运行一次target中某一个方法
long endTime = System.currentTimeMillis();
System.out.println(method.getName()+"()的运行时间是"
+ (endTime - beginTime));
return reVal;
//该返回值是调用代理实例中某个方法时该方法返回的值
}
});
proxy.add("bucuo");
proxy.remove("nihaoa");
System.out.println(proxy.toString());
}
}
图片看不清楚,可以粘贴到MyEclipse里面按Ctrl+Shift+F格式就会规范了
|
|