dac*_*c1n 1 java reflection field reference
我试图在java中获取编译时安全的字段引用,不使用反射和字符串,而是直接引用该字段。就像是
MyClass::myField
我已经尝试了通常的反射方式,但是您需要将字段引用为字符串,这在重命名的情况下很容易出错,并且不会引发编译时错误
编辑:只是想澄清一下,我的最终目标是获取用于实体目的的字段名称,例如在查询中引用实体字段,而不是值
不幸的是,你可能还想拥有一只独角兽。从您所要求的意义上来说,“字段引用”的概念根本不是 java 语言的一部分。
该MyClass::myThing语法仅适用于方法。对于字段来说根本就没有这样的东西。很不幸。
为任何语言的设计决策给出客观的理由都是非常困难的;它要么需要深入了解设计师的集体头脑,这需要魔法或科幻小说,要么要求他们透露秘密,而他们在堆栈溢出问题中可能不会这样做。有时(以及最近的 Java 功能,例如这个),设计会在公开场合进行辩论。具体来说,您可以搜索 openjdklamba-dev邮件列表,其中无疑涵盖了这个问题。您需要浏览(我并不夸张)数以万计的帖子,但是,好消息是,它是可以搜索的。
但是,当我花了一些时间讨论 Lambda 项目的设计时,我可以猜测/挖掘自己的记忆:
直接字段访问在 java 生态系统中并不常见。该语言允许直接字段访问,但很少有 Java 程序是这样编写的,所以为什么要创建一个只能立即有用且为外来群体所熟悉的语言功能呢?
所需的基础设施也相当重要 - 不允许用 java 编写方法 lambda,除非您在使编译器可以将 lambda“视为”类型(具体来说,是@FunctionalInterface任何接口)的上下文中使用它恰好包含 1 个方法(除了 jlObject 本身中已存在的方法)。换句话说,这很好:
Function<String, String> f = String::toLowerCase;
Run Code Online (Sandbox Code Playgroud)
但这不是:
Object o = String::toLowerCase;
Run Code Online (Sandbox Code Playgroud)
所以,让我们想象一下现场裁判确实存在。这意味着什么?表达式的“类型”是什么MyClass::myField?也许是一个新概念:具有2 个方法的接口;其中一个不带参数并返回 T,另一个需要 T 并且不返回任何内容(以匹配读取字段和写入字段的行为),但是如果它是属于其中之一的 FunctionInterface,那么它也是可以接受的,也许?听起来很复杂。
java 设计团队现在(并且已经有一段时间了)的普遍心态是不要让事情变得过于复杂:除非有充分的理由,否则不要添加功能。毕竟,如果社区确实迫切需要现场裁判,那么就可以添加他们。但是,如果另一方面,它们被添加但没有人使用它们,则它们无法被删除(因此,您现在已经永久地使语言变得更加复杂,并减少了未来语言功能的空间,因为没有人使用并且最常使用的东西)风格指南告诉你要积极避免)。
我很确定,这就是它们不存在的原因。
| 归档时间: |
|
| 查看次数: |
733 次 |
| 最近记录: |