为什么Java 动态代理可以将 $Proxy0 强转成接口?
public class DY {
public static void main(String[] args) {
MyHandler myHandler = new MyHandler();
Bird bird = (Bird) Proxy.newProxyInstance(Bird.class.getClassLoader(), new Class[]{Bird.class}, myHandler);
System.out.println(bird.getClass().getName());
bird.fly();
}
static class MyHandler implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("time ------> ");
return null;
}
}
interface Bird {
void fly();
}
}
我打印了 bird
的 classname
输出如下:com.example.pdog.dy.$Proxy0
为什么可以强转成Bird
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
Proxy.newProxyInstance方法的第二个参数是代理生成的类需要实现的接口,
你的参数为new Class[]{Bird.class}, newProxyInstance出来的对象实现了Bird接口
所以可以强转为Bird,如果你的参数为new Class[]{Tiger.class} 就不能转为Bird
说的有点拗口
把$Proxy0 线程中的class文件dump出来看一下一目了然:
$Proxy0实现了Bird接口,当然可以类型转化