微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 Java 的动态代理需要反射?

如何解决为什么 Java 的动态代理需要反射?

Java 的 Dynamic Proxy Docs 将这些构造函数描述如下:

动态代理类是一种实现在运行时指定的接口列表的类,这样通过类实例上的一个接口调用方法将被编码并通过统一接口分派到另一个对象。因此,动态代理类可用于为接口列表创建类型安全的代理对象,而无需预先生成代理类。

现在,虽然这句话中的所有内容都是准确的。所有这些信息实际上都在编译时出现。在 Java 中,当您创建代理时,您可以在代码中指定要代理的确切接口。

现在真正让我困惑的第一件事,就是为什么这里的字节码需要在运行时生成?所有这些信息都在编译时出现......(你甚至不必处理类型擦除)

P.S:我不确定是否仍然如此,基于这里一个相当过时的接受答案:How does Java's Dynamic Proxy actually work?)

完成这项工作的下一步是类型检查/类型推断。我不确定 Java 实际上如何处理这个问题,但您需要能够将 Proxy<A>A 互换使用。为了拉这个你需要以下内容

∀ method m ∈ A,m ∈ Proxy<A>

这意味着

  1. 您需要代理具有相同的结构
  2. 您需要某种委托(即动态调度)。

一旦你开始写出推理规则,这会给我们一些非常熟悉的东西。 结构类型

现在 Java 没有结构化类型,但可以轻松添加少数推理规则(即 Typescript),特别是考虑到 Java 具有盒装原语(例如 Scala 没有,这使得引入结构化推理变得非常困难)。

>

实际问题

反射很难、不安全且性能不高。我的问题是 Java 的代理为什么以及如何使用反射?似乎大部分功能都可以使用该语言中已有的其他功能来实现。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。