进入课堂'字段没有使用反射?

时间:2015-09-09 09:07:41

标签: java reflection

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

考虑这个课程:

class MyType {
    public int theNumber;
}

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

这肯定有用:

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

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

Field f = MyType.class::theNumber;

这是可能的还是编程能力的方式?

3 个答案:

答案 0 :(得分:2)

有趣的问题。不,如果不使用java.lang.reflect,就没有办法做到这一点,但鉴于课程中内置的class伪属性,我可以理解你为什么要问。

答案 1 :(得分:1)

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

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

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

所以基本的想法是:

  1. 编写一个注释处理器,用于扫描您想要反映的源代码
  2. 通过javax.lang.model.element.ElementVisitor提取您想要访问的字段
  3. 如果您想生成对Field的类型保存访问:

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

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

    3.2。通过ProcessingEnvironment.getMessager()。printMessage()

    引发错误

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

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

答案 2 :(得分:-1)

不,它不是......但你可以通过界面和闭包来实现它

public interface Getter<T, V> {
    V get(T object);
}

public static Getter<MyType, Integer> theNumberGetter = (MyType myType) -> { myType.theNumber };