我的以下代码尝试创建一个代理对象,我希望在调用"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
只能强制转换为Interface
并且这行代码p.getClass().getInterfaces()
将返回空接口,因为Person2
没有实现任何接口,
因此,要解决此问题Person2
需要实现一个Interface
:
public class Person2 implements IPerson{
private String name;
public Person2(String name) {
this.name = name;
}
@Override
public void say() {
System.out.println("Person:" + name);
}
}
接口:
public interface IPerson {
public void say();
}
然后在主静态方法中,可以将代理强制转换为接口并调用该方法:
public class TestProxy {
public static void main(String [] args) {
Person2 p = new Person2("myName");
InvocationHandler invocationHandler = new MyHandler(p);
IPerson obj = (IPerson) Proxy.newProxyInstance(
p.getClass().getClassLoader(),
p.getClass().getInterfaces(),
invocationHandler);
obj.say();
}
}