【发布时间】:2019-06-01 17:18:19
【问题描述】:
我的以下代码尝试创建一个代理对象,我希望在调用“say()”之前打印“之前”:
class Person2 {
private String name;
public Person2(String name) {
this.name = name;
}
public void say() {
System.out.println("Person:" + name);
}
}
class MyHandler implements InvocationHandler {
private Object object;
public MyHandler(Object o) {
object = o;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //
System.out.println("before");
return method.invoke(object, args);
}
}
public class TestProxy {
public static void main(String [] args) {
Person2 p = new Person2("myName");
InvocationHandler invocationHandler = new MyHandler(p);
Person2 obj = (Person2) Proxy.newProxyInstance(
p.getClass().getClassLoader(),
p.getClass().getInterfaces(),
invocationHandler);
obj.say();
}
}
但实际上它会抛出一个异常:
Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy0 cannot be cast to Person2
at TestProxy.main
那么我在哪里做错了,如何解决呢?
【问题讨论】:
-
你不能用
java.lang.reflect.Proxy代理类,只能代理接口。
标签: java class casting proxy instance