【发布时间】:2017-08-03 06:29:12
【问题描述】:
我正在写Annotation processor,它使用如下所示的 Android DataBinding:
public @interface Bind{
int brID();
}
并像这样使用它:
@Bind(brID = BR.someBind)
class Test{
// Some code
}
一切似乎都还好,但是当我尝试在注释处理器中访问 brID 值时,它给出了 AnnotationTypeMismatchException 表示 int 不能转换为 BR 尽管我指定了 BR.someBind 即 @987654329 @。
我知道BR 类是在构建过程中生成的,所以我假设我的处理器恰好在没有生成BR 常量并且只有BR 类存在时进行处理。
现在我正在通过反射访问价值。我指定"someBind" 值并在BR 类的默认位置创建类BRFinder,然后访问名为“someBind”的类字段并将其返回int 值。但这并不是最好的解决方案,因为:a) BR 类的位置可以改变,b) 字段名称可以由于混淆而改变,c) 反射并不是很快的事情。
所以我的问题是:如何访问在构建过程中生成的值?
【问题讨论】:
-
是 someBind 常量吗?
-
@ΦXocę웃Пepeúpaツ 基本上是的。
DataBinding生成带有可以使用的常量(public static final int字段)的 BR 类。而“someBind”是BR.someBind -
@ΦXocę웃Пepeúpaツ 但是这个常数后面的数字可能会改变。例如,如果您有 3 个绑定字段,则 BR 将为您提供 3 个带有值的常量(例如):1 代表
BR.bind1,2 代表BR.bind2,3 代表BR.bind3。然后,如果您删除BR.bind1,所有下一个值都将递减。所以你不能总是假设 BR.someBind 总是有相同的值。
标签: java android annotations android-databinding