2017-08-03 62 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类。