例如与
class Foo {
Integer bar;
}
我想知道为什么没有语言功能让我能够做到
Foo.class.bar //yes, xxx.class returns something of java.lang.Class<T>
参考元字段栏?
我正在阅读 Pro JPA 2 书,在我看来,规范元模型生成是必要的,因为这在 Java 中是不可能的。
注意,这是一个出于好奇的理论问题,我想从中获得一些见解,为什么这个功能没有实现。
---更新---
为了更详细地阐述我的问题,请考虑通过 Entity Graph API 在 JPA 中添加属性的示例:
EntityGraph<Foo> g = myEntityManager.createEntityGraph(Foo.class)
g.addAttributeNodes("bar")
字符串“bar”和 Foo 的属性
bar
之间没有正式的链接(对于编译器/IDE)。
因为
.class
不是一个在编译时返回当前类的魔法字段,它只是一个 sugar 来替换 getClass()
方法,该方法仅在运行时在 Class
对象的实例上执行。实现你的“功能”需要重建整个概念。
回答你的问题的最可信的理论将基于这样的想法:当反射模型是用 Java 设计时,你的“功能”在当时看起来并不真正“有用”。
我想说,没有这样的功能的主要原因是它没有用处。
为什么我们会要求特定类中特定字段的元信息?
如果我们对类和字段对进行硬编码,那么我们已经知道字段的所有元信息,因为它们无法在运行时更改。当我们已经知道结果是
Foo.class.bar.getType()
时,通过Integer.class
获得的信息有何用途?
理论上我不会将类属性/字段称为“元”字段。元数据通过java注释分配给属性/字段,并且该元数据通过反射访问。通过执行 Foo.class.bar,您破坏了这种美丽的静态语言的面向对象的全部意义。 (或者换句话说,java 还不够 groovy 来做到这一点))