2017-08-03 1 views
2

私はこのようになりますAndroidのデータバインディング使用することAnnotation processorを書いている:アクセス

public @interface Bind{ 
    int brID(); 
} 

そして、このようにそれを使用する:

​​

すべてがOKようだが、とき注釈プロセッサでbrIDの値にアクセスしようとしましたが、がintであるにもかかわらず、intBRにキャストできないというAnnotationTypeMismatchExceptionとなります。

私は、ビルドプロセス中にクラスが生成されることを知っていますので、BR定数が生成されず、BRクラスが存在するときにプロセッサが処理されると思います。

今のところ私はリフレクションで価値を得ています。私は"someBind"の値を指定し、デフォルトの場所にBRのクラスBRFinderを作成し、そのクラスのフィールドに "someBind"という名前でアクセスし、intという値を返します。しかし、これは実際には最良の解決策ではありません:a)BRクラスの場所は変更できます。b)難読化によってフィールド名が変更される可能性があります。c)リフレクションは本当に速いものではありません。

私の質問は、ビルド時に生成される値にどのようにアクセスできますか?

+0

は*** someBind ***定数ですか? –

+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クラス。