Java Proxy.newProxyInstance() 抛出类型转换异常?

Java Proxy.newProxyInstance() throws type cast exception?

我的以下代码尝试创建一个我希望在调用 "say()" 之前打印 "before" 的代理对象:

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() 会 return 空接口,因为 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();
    }
}