gpt4 book ai didi

java - 使用注释传递值时获取 Android R 类?

转载 作者:行者123 更新时间:2023-11-30 00:35:28 25 4
gpt4 key购买 nike

我有这个注解 BindPrefRes.class

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.SOURCE)
public @interface BindPrefRes {
@StringRes int value();
}

现在,当我像这样在任何 Android 项目中使用该注释时:

@BindPrefRes(R.string.app_name) String appName;

我正在尝试使用 javax.annotation.processing.AbstractProcessor 获取值

int value = element.getAnnotation(BindPrefRes.class).value()

我得到了实际的 int (2131230753),据我所知这是预期的行为。但是如何将此 int 解析回字段 (R.string.app_name),或者至少是该字段的字符串表示形式 ("R.string.app_name")?

source code is on GitHub如果我不清楚。

最佳答案

简短回答:您应该尽可能避免这样做,因为可能根本无法获得所需的信息。例如,如果 Gradle(或其他构建系统)开始支持带有注解处理器的增量构建,则在处理器运行时,R 类可能不会出现在编译路径上。

长答案:有两种方式:

  1. 扫描 R 类的源代码
  2. 遍历找到的 R 类中的每个字段并将所有常量添加到 Map
  3. 将从注解接收的值与来自 map 的常量相关联

One implementation这种方法(出于某种原因依赖于非公共(public) Javac 内部)可以在 ButterKnife 资源中找到)。

Another one由 Android Annotations 项目维护(您可以通过将您的处理器设为 Android Annotations 处理器的插件来复制或直接访问它)。

也丑

使用 Oracle 专有的半稳定 Trees API 直接内省(introspection) @BindPrefRes(R.string.app_name) 的源代码。我建议尽可能采用这种方式,因为它的副作用更少。

Obtain a TreePath对于注释值,将其转换为 ExpressionTree 并手动解析内容。

关于java - 使用注释传递值时获取 Android R 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43477024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com