本帖最后由 黄云南 于 2012-3-29 02:50 编辑
- class Test2 {
- public static void main(String[] args) {
- Collection proxyArrayList = (Collection)Proxy.newProxyInstance(
- Collection.class.getClassLoader(),
- new Class[]{Collection.class},
-
- new InvocationHandler() {
- ArrayList target = new ArrayList();
- public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
- System.out.println(method);
- System.out.println(target.getClass().getMethod("add", Object.class));
- Object obj = method.invoke(target, args);
- return obj;
- }
- });
- proxyArrayList.add("abc");
- }
复制代码 打印结果:
public abstract boolean java.util.Collection.add(java.lang.Object)
public boolean java.util.ArrayList.add(java.lang.Object)
上面是张孝祥老师讲解动态代理类时的一段代码,我很奇怪传进invoke的那个method是谁的方法,于是改了下代码验证,
method的字节码对象和target的add方法的字节码文件不一样啊,也就是method的add方法不是target的add方法。
method的add方法是public abstract boolean java.util.Collection.add中的方法他的方法是空的啊怎么能调用invoke方法,
更奇怪的是一个空的方法怎么向集合中添加元素呢。 |