不使用反射访问 class' 字段?
Access to class' Fields without using reflection?
有没有办法在不使用反射的情况下访问 class 上的特定 Field
?
考虑这个 class:
class MyType {
public int theNumber;
}
我想在哪里访问 theNumber
的 java.lang.reflect.Field
。
这肯定有效:
Field f = MyType.class.getDeclaredField("theNumber");
但是,我想对字段名称进行编译检查,所以理想情况下是这样的(但当然我的示例无法编译):
Field f = MyType.class::theNumber;
这是可能的还是我有编译器能力的方式?
有趣的问题。不,如果不使用 java.lang.reflect
就无法做到这一点,但考虑到 类 上的内置 class
伪 属性,我明白你为什么会问了。
不,不是...但您可以使用接口和闭包实现它
public interface Getter<T, V> {
V get(T object);
}
public static Getter<MyType, Integer> theNumberGetter = (MyType myType) -> { myType.theNumber };
JPA2 元模型(用于类型安全查询 "by criteria")具有类似的概念。
MyType_.theNumber
由额外的"pre-processors"实现。您可以在这方面进行调查。
您可以使用注释处理器扩展 java 编译器。该处理器是一种在编译期间扫描源代码的方法。它们是通过注释引入的,但它们能够扫描整个源代码,而不仅仅是注释。
使用扫描的源代码,您可以为您编译的任何 class 生成访问器 classes。这样你就可以消除反射。
如果您只想在 IDE 中编写代码时出错,您可以使用 javax.annotation.processing.ProcessingEnvironment.getMessager().printMessage()(另请参阅 javax.tools.DiagnosticListener)生成IDE 可以显示的错误。
所以基本思路是:
- 写一个注解处理器扫描你想反映的源代码
- 提取您希望通过 javax.lang.model.element.ElementVisitor
访问的字段
如果您想生成对字段的类型保存访问:
3.1。生成将访问此源代码的源代码
如果您想确保对字段的反射调用有效:
3.2。通过 ProcessingEnvironment.getMessager().printMessage()
引发错误
当然你必须编写检查反射调用或生成访问器的代码。
并且您想要获取的信息必须可以从源代码中提取,因为所有的魔法都发生在编译期间而不是运行时
有没有办法在不使用反射的情况下访问 class 上的特定 Field
?
考虑这个 class:
class MyType {
public int theNumber;
}
我想在哪里访问 theNumber
的 java.lang.reflect.Field
。
这肯定有效:
Field f = MyType.class.getDeclaredField("theNumber");
但是,我想对字段名称进行编译检查,所以理想情况下是这样的(但当然我的示例无法编译):
Field f = MyType.class::theNumber;
这是可能的还是我有编译器能力的方式?
有趣的问题。不,如果不使用 java.lang.reflect
就无法做到这一点,但考虑到 类 上的内置 class
伪 属性,我明白你为什么会问了。
不,不是...但您可以使用接口和闭包实现它
public interface Getter<T, V> {
V get(T object);
}
public static Getter<MyType, Integer> theNumberGetter = (MyType myType) -> { myType.theNumber };
JPA2 元模型(用于类型安全查询 "by criteria")具有类似的概念。
MyType_.theNumber
由额外的"pre-processors"实现。您可以在这方面进行调查。
您可以使用注释处理器扩展 java 编译器。该处理器是一种在编译期间扫描源代码的方法。它们是通过注释引入的,但它们能够扫描整个源代码,而不仅仅是注释。
使用扫描的源代码,您可以为您编译的任何 class 生成访问器 classes。这样你就可以消除反射。
如果您只想在 IDE 中编写代码时出错,您可以使用 javax.annotation.processing.ProcessingEnvironment.getMessager().printMessage()(另请参阅 javax.tools.DiagnosticListener)生成IDE 可以显示的错误。
所以基本思路是:
- 写一个注解处理器扫描你想反映的源代码
- 提取您希望通过 javax.lang.model.element.ElementVisitor 访问的字段
如果您想生成对字段的类型保存访问:
3.1。生成将访问此源代码的源代码
如果您想确保对字段的反射调用有效:
3.2。通过 ProcessingEnvironment.getMessager().printMessage()
引发错误当然你必须编写检查反射调用或生成访问器的代码。
并且您想要获取的信息必须可以从源代码中提取,因为所有的魔法都发生在编译期间而不是运行时