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

时间:2015-12-23 16:04:49

标签: java android-studio static-analysis lint

Android提供support annotations,我对@StringRes系列注释特别感兴趣,用于标记整数参数,使您无法传递有效资源而非任何随机值。

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

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注释我想标记映射数据库整数外键的类的整数字段,希望我不会混合来自不同表/类的外键整数值(因此我然后每个班级都会有FooPkBarPk等。但是,当我写这样的代码时:

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

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

annotation trolling level over 9000

因此很明显,除了定义注释的类之外,验证是由别的执行的。这发生在哪里?更重要的是,我如何对我的自定义@IntPk进行与Android @StringRes相同的检查,并将其存储在我的项目中,以便团队中的其他开发人员具有相同级别的额外类型检查?

1 个答案:

答案 0 :(得分:1)

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

另一种可能性是建立在Checker Framework的基础上,这是一种旨在使编写注释处理器更容易的工具。它的Fake Enumeration Checker或其Subtyping Checker可能已经完成了您的需要,或者您可以编写自己的检查程序来执行您的规则。虽然这是一个更具表现力和灵活性的解决方案,但缺点是它没有集成到Android Studio中。