簡體   English   中英

訪問類的字段而不使用反射?

[英]Access to class' Fields without using reflection?

有沒有一種方法可以在不使用反射的情況下訪問類中的特定Field

考慮此類:

class MyType {
    public int theNumber;
}

我想訪問theNumberjava.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可以顯示的錯誤。 。

因此,基本思想是:

  1. 編寫注釋處理器,以掃描您要反映的源代碼
  2. 通過javax.lang.model.element.ElementVisitor提取您想要訪問的字段

如果要生成類型,請保存對字段的訪問:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM