如何创建自己的资源类型注释,如@StringRes?

How can I create my own resource type annotation like @StringRes?

Android 提供了 support annotations,我对 @StringRes 系列注解特别感兴趣,它用于标记整数参数,强制传递有效资源而不是任何随机值。

使用 Android Studio 我查看了 @StringRes 的实现并将其复制到我自己的项目中的自定义 class 中:

package com.foo.bar.model.db;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.RetentionPolicy.CLASS;

/**
 * Denotes that an integer parameter, field or method return value is expected
 * to be an integer resource reference (e.g. {@link android.R.integer#config_shortAnimTime}).
 */
@Documented
@Retention(CLASS)
@Target({METHOD, PARAMETER, FIELD, LOCAL_VARIABLE})
public @interface IntPk {
}

有了这个新的 @IntPk 注释,我想标记映射数据库整数外键的 classes 的整数字段,希望我不会混合来自不同的外键整数值tables/classes(因此我会为每个 class 设置 FooPkBarPk 等)。但是,当我这样写代码时:

    @IntegerRes int androidValue;
    androidValue = 42;
    @IntPk int customValue;
    customValue = 42;

Android Studio 仅突出显示 androidValue 分配,如以下屏幕截图所示:

因此很明显,验证是由 其他东西 执行的,而不是 class 定义注释。这发生在哪里?更重要的是,我如何才能像 Android SDK 对 @StringRes 那样对我的自定义 @IntPk 进行相同的检查,并将其存储在我的项目中以供团队中的其他开发人员使用相同的额外类型检查的级别?

Powerlord 是正确的,您需要编写一个注解处理器。注释处理器将分析您的源代码并发出有关注释和代码不匹配的警告。您可以复制和修改 Android Studio 中内置的任何内容。

另一种可能性是基于 Checker Framework, a tool designed to make it easier to write annotation processors. Its Fake Enumeration Checker or its Subtyping Checker 可能已经满足您的需求,或者您可以编写自己的检查器来执行您的规则。虽然这是一个更具表现力和灵活性的解决方案,但缺点是它没有集成到 Android Studio 中。