黑马程序员技术交流社区
标题:
动态代理问题
[打印本页]
作者:
kevinmesss.tz
时间:
2014-4-18 07:08
标题:
动态代理问题
package com.javase.proxy;
import java.lang.reflect.*;
import java.util.*;
public class ProxyDemo {
public static void main(String[] args) {
final ArrayList<String> alist = new ArrayList<>();
ArrayList<String> proxy = (ArrayList<String>) Proxy.newProxyInstance(alist.getClass().getClassLoader(), alist.getClass().getInterfaces(), new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("invokee............");
method.invoke(alist, args);
System.out.println("huhuhu");
return true;
}
});
proxy.add("test");
}
}
复制代码
为什么会有com.sun.proxy.$Proxy0 cannot be cast to java.util.ArrayList异常
换成Collection<String>就可以?(后面还是new ArrayList())
Object不能强转成ArrayList吗?
作者:
水蓝
时间:
2014-4-18 12:27
楼主这边要清楚的是,代理对象不是原来的对象了。
你用Collection可行,是因为Collection是一个接口。
并且:List接口继承于Collection。
代理的运行并不关心你原来的方法是怎么实现的,这里只关心有哪些方法,方法前、方法后需要通过代理增加哪些操作。
作者:
王军行
时间:
2014-5-6 21:19
你只是实现了ArrayList类的所有接口的方法,但是ArrayList类还有它自己的方法,是接口中没有的,这样你生成的代理类并不是ArrayList的子类,所以不能转换成ArrayList.
如果想要生成一类的子类当代理,可以使用第三方的Cglib来实现
需要了解其中的一个类和一个接口就可最做了
MethodInterceptor 方法回调接口
Enhancer 生成代理对象的类
用法和proxy类似
Enhancer enhancer = new Enhancer(); // 实例化类
enhancer.setSuperclass(clazz);将要代理的类的字节码传入,就是父类
enhancer.setCallback(new MethodInterceptor(){} );//传入一个回调器实例,类似于InvocationHandler
enhancer.create();创建实例用Object接收,可以强转为父类型
作者:
酱油炒饭
时间:
2014-5-8 22:53
菜鸟 路过瞅瞅~~
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2