[英]Access to class' Fields without using reflection?
有沒有一種方法可以在不使用反射的情況下訪問類中的特定Field
?
考慮此類:
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
的內置class
偽屬性,我可以理解為什么會這樣。
您可以使用注釋處理器擴展Java編譯器。 該處理器是在編譯過程中掃描源代碼的一種方式。 它們是隨注釋一起引入的,但是它們不僅可以掃描注釋,而且還可以掃描整個源代碼。
使用掃描的源代碼,您可以生成訪問器類,以編譯任何類。 這樣您可以消除反射。
如果只想在IDE中編寫代碼時出錯,則可以使用javax.annotation.processing.ProcessingEnvironment.getMessager()。printMessage()(另請參見javax.tools.DiagnosticListener)來生成IDE可以顯示的錯誤。 。
因此,基本思想是:
如果要生成類型,請保存對字段的訪問:
3.1。 生成將訪問此源代碼的源
如果您想確保對字段的反射調用有效:
3.2。 通過ProcessingEnvironment.getMessager()。printMessage()引發錯誤
當然,您必須編寫代碼以檢查反射調用或生成訪問器。
而且,您想獲取的信息必須可從源代碼中提取出來,因為所有的魔術都發生在編譯期間而不是在運行時
JPA2元模型(用於類型安全查詢“按條件”)具有類似的概念。
MyType_.theNumber
由額外的“預處理器”實現。 您可以在這方面進行調查。
不,不是...但是您可以通過接口和閉包來實現
public interface Getter<T, V> {
V get(T object);
}
public static Getter<MyType, Integer> theNumberGetter = (MyType myType) -> { myType.theNumber };
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.