2017-08-03 63 views
2

我寫Annotation processor使用Android的數據綁定,看起來像這樣:訪問生成的類中的註釋處理

public @interface Bind{ 
    int brID(); 
} 

而且使用這樣的:

​​

一切似乎都OK,但是當我試圖訪問brID它註釋處理器中的值AnnotationTypeMismatchException,它說int無法投射到BR,儘管我指定BR.someBindint

我知道BR類是在構建過程中生成的,所以我假設我的處理器恰好在BR常量沒有生成時處理,並且只有BR類存在。

現在我正在通過反射訪問價值。我指定"someBind"值並在默認位置BR類中創建類BRFinder,然後使用名稱「someBind」訪問該類字段並返回值int值。但是這不是最好的解決方案,因爲:a)BR類的位置可以改變,b)字段名稱可以由於混淆而改變,c)反射並不是真正快速的事情。

所以我的問題是:如何訪問構建期間生成的值?

+0

是***一些常量? –

+1

@ΦXocę웃Пepeúpaツ基本上可以。 'DataBinding'用常量('public static final int'字段)生成可以使用的BR類。並且「someBind」是'BR.someBind' – Ekalips

+1

@ΦXocę웃Пepeúpaз但是這個常量的數字可能會改變。例如,如果您有3個綁定字段,BR將爲您使用3個常量(例如):BR.bind1爲1,BR.bind2爲2,BR.bind3爲3。然後如果你刪除了'BR.bind1',所有下一個值將會減少。所以你不能總是假設BR.someBind將始終具有相同的值。 – Ekalips

回答

0

正如其他人已經提到的那樣,由於BR ID的定期更改,最好在生成的代碼中引用BR.property,而不是直接插入參考值。

一種可能性將是修改的註釋是:

public @interface Bind { 
    /** 
    * BR Class. 
    */ 
    Class br(); 

    /** 
    * BR Class Property. 
    String property(); 
} 

而且您的使用情況是:

@Bind(br = BR.class, property = "someBind") 
class Test{ 
    // Some code 
} 

然後,在你的註釋處理器,生成訪問的屬性代碼提供BR類。