PJLN 2017-07-19 15:04 采纳率: 100%
浏览 2520
已采纳

关于动态代理中的类型转换的问题

public interface Person {
void eat();
}

public class Student implements Person {

@Override
public void eat() {
    System.out.println("吃饭");
}

}

public class PersonProxy implements InvocationHandler{
private Person p;
public PersonProxy(Person obj){
this.p=obj;
}
@Override
public Person invoke(Object proxy, Method method, Object[] args) throws Throwable {
if(method.getName().equals("eat")){
System.out.println("代理测试");
}
return (Person) method.invoke(p, args);
}
public Object getProxy(){
return Proxy.newProxyInstance(p.getClass().getClassLoader(), p.getClass().getInterfaces(), this);
}
}

public class Mytest {
public static void main(String[] args) {
Person p=(Person) new PersonProxy(new Student()).getProxy();
p.eat();
//这里会报类型转换错误
Student st=(Student) new PersonProxy(new Student()).getProxy();
st.eat();

}

}

想知道为啥我传的是Student对象,为哈转Student调用eat()方法会报类型转换异常?转Person就不会有异常!

  • 写回答

2条回答 默认 最新

  • SonOfWind0311 2017-07-20 02:36
    关注

    虽然Proxy传入的是Student对象,但是getProxy方法返回的不是这个Student对象,而是代理动态生成的一个类(比如Proxy$0)的实例。
    这个新生成的类Proxy$0实现了Person接口,跟Student类不是一个,是实现了同一个接口的两个类。因此:
    getProxy方法得到的实例转成Person没有问题,因为它的类确实实现了Person接口,但是转成Student报错,因为它们是两个类。
    动态代理的详细原理已有问题解答可以参考:http://ask.csdn.net/questions/233571

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记