【问题标题】:Java Proxy.newProxyInstance() throws type cast exception?Java Proxy.newProxyInstance() 抛出类型转换异常?
【发布时间】: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


【解决方案1】:

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();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多