为什么Java 动态代理可以将 $Proxy0 强转成接口?

发布于 2022-09-06 02:21:52 字数 783 浏览 13 评论 0

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

我打印了 birdclassname 输出如下:
com.example.pdog.dy.$Proxy0
为什么可以强转成Bird?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

且行且努力 2022-09-13 02:21:52

Proxy.newProxyInstance方法的第二个参数是代理生成的类需要实现的接口,
你的参数为new Class[]{Bird.class}, newProxyInstance出来的对象实现了Bird接口
所以可以强转为Bird,如果你的参数为new Class[]{Tiger.class} 就不能转为Bird
说的有点拗口

梦途 2022-09-13 02:21:52

把$Proxy0 线程中的class文件dump出来看一下一目了然:
$Proxy0实现了Bird接口,当然可以类型转化

final class $Proxy0 extends Proxy implements Bird {
    private static Method m1;
    private static Method m3;
    private static Method m2;
    private static Method m0;

    public $Proxy0(InvocationHandler var1) {
        super(var1);
    }

    static {
        try {
            m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[]{Class.forName("java.lang.Object")});
            m3 = Class.forName("com.tiny.work.pro_con.DY$Bird").getMethod("fly", new Class[0]);
            m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]);
            m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]);
        } catch (NoSuchMethodException var2) {
            throw new NoSuchMethodError(var2.getMessage());
        } catch (ClassNotFoundException var3) {
            throw new NoClassDefFoundError(var3.getMessage());
        }
    }

    public final boolean equals(Object var1) {
        try {
            return ((Boolean)super.h.invoke(this, m1, new Object[]{var1})).booleanValue();
        } catch (RuntimeException | Error var3) {
            throw var3;
        } catch (Throwable var4) {
            throw new UndeclaredThrowableException(var4);
        }
    }

    public final String toString() {
        try {
            return (String)super.h.invoke(this, m2, (Object[])null);
        } catch (RuntimeException | Error var2) {
            throw var2;
        } catch (Throwable var3) {
            throw new UndeclaredThrowableException(var3);
        }
    }

    public final int hashCode() {
        try {
            return ((Integer)super.h.invoke(this, m0, (Object[])null)).intValue();
        } catch (RuntimeException | Error var2) {
            throw var2;
        } catch (Throwable var3) {
            throw new UndeclaredThrowableException(var3);
        }
    }

    public final void fly() {
        try {
            super.h.invoke(this, m3, (Object[])null);
        } catch (RuntimeException | Error var2) {
            throw var2;
        } catch (Throwable var3) {
            throw new UndeclaredThrowableException(var3);
        }
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文