gpt4 book ai didi

java - 不使用反射访问类的字段?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:54:25 26 4
gpt4 key购买 nike

有没有一种方法可以在不使用反射的情况下访问类中的特定Field

考虑这个类:

class MyType {
public int theNumber;
}

我想在哪里访问 theNumberjava.lang.reflect.Field

这肯定有效:

Field f = MyType.class.getDeclaredField("theNumber");

但是,我想对字段名称进行编译检查,所以理想情况下是这样的(但当然我的示例无法编译):

Field f = MyType.class::theNumber;

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

最佳答案

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

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

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

所以基本思路是:

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

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

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

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

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

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

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

关于java - 不使用反射访问类的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32475419/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com