Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在注释处理中访问生成的类_Java_Android_Annotations_Android Databinding - Fatal编程技术网

Java 在注释处理中访问生成的类

Java 在注释处理中访问生成的类,java,android,annotations,android-databinding,Java,Android,Annotations,Android Databinding,我正在编写使用Android数据绑定的注释处理器,如下所示: public @interface Bind{ int brID(); } 然后像这样使用它: @Bind(brID = BR.someBind) class Test{ // Some code } 看起来一切正常,但当我尝试访问annotation processor中的brID值时,它给出了AnnotationTypeMismatchException,表示int无法强制转换为BR,尽管我指定了BR.some

我正在编写使用Android数据绑定的
注释处理器
,如下所示:

public @interface Bind{
    int brID();
}
然后像这样使用它:

@Bind(brID = BR.someBind)
class Test{
    // Some code
}
看起来一切正常,但当我尝试访问annotation processor中的
brID
值时,它给出了
AnnotationTypeMismatchException
,表示
int
无法强制转换为
BR
,尽管我指定了
BR.someBind
,即
int

我知道
BR
类是在构建过程中生成的,所以我假设我的处理器在未生成
BR
常量时恰好进行处理,并且只存在
BR

现在我通过反射来获取价值。我指定
“someBind”
值,并在
BR
类的默认位置创建类
BRFinder
,然后访问名为“someBind”的类字段并返回它
int
值。但这并不是最好的解决方案,因为:a)类的位置可以更改,b)字段名可以由于混淆而更改,c)反射不是很快的事情


所以我的问题是:如何访问构建期间生成的值

如其他人所述,由于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类属性的代码。

someBind是常数吗?@ΦXocę웃Пepeúpaツ 基本上是的<代码>数据绑定生成BR类,该类包含可使用的常量(
公共静态最终int
字段)。“someBind”是
BR.someBind
@ΦXocę웃Пepeúpaツ 但这个常数背后的数字可能会改变。例如,如果您有3个绑定字段,BR将有3个常量和值(例如):1个用于
BR.bind1
,2个用于
BR.bind2
,3个用于
BR.bind3
。然后,如果删除
BR.bind1
,则所有下一个值都将递减。所以你不能总是假设BR.someBind总是有相同的值。