【问题标题】:Access to generated classes in annotation processing访问注释处理中生成的类
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    相关资源
    最近更新 更多