不使用反射访问类'字段?

Gei*_*eir 8 java reflection

有没有办法Field在不使用反射的情况下访问类的特定内容?

考虑这个课程:

class MyType {
    public int theNumber;
}
Run Code Online (Sandbox Code Playgroud)

我希望能够访问theNumber的地方 java.lang.reflect.Field.

这肯定有效:

Field f = MyType.class.getDeclaredField("theNumber");
Run Code Online (Sandbox Code Playgroud)

但是,我想编译检查字段名称,所以理想情况下这样的东西(但当然我的例子不编译):

Field f = MyType.class::theNumber;
Run Code Online (Sandbox Code Playgroud)

这是可能的还是我对编译器能力的方式?

小智 4

您可以使用注释处理器来扩展 java 编译器。该处理器是一种在编译期间扫描源代码的方法。它们是通过注释引入的,但它们能够扫描整个源代码而不仅仅是注释。

使用扫描的源代码,您可以为您编译的任何类生成访问器类。这样就可以消除反射。

如果您只想在 IDE 中编写代码时出现错误,您可以使用 javax.annotation.processing.ProcessingEnvironment.getMessager().printMessage() (另请参阅 javax.tools.DiagnosticListener)来生成 IDE 可以显示的错误。

所以基本的想法是:

  1. 编写一个注释处理器来扫描您想要反映的源代码
  2. 通过 javax.lang.model.element.ElementVisitor 提取您想要访问的字段

如果您想生成对字段的类型保存访问:

3.1. 生成将访问此源代码的源

如果您想确保对字段的反射调用有效:

3.2. 通过ProcessingEnvironment.getMessager().printMessage()引发错误

当然,您必须编写用于检查反射调用或生成访问器的代码。

并且您想要获取的信息必须可以从源代码中提取,因为所有的魔法都发生在编译期间而不是运行时