在编译/运行时强制执行android批注

时间:2018-10-18 09:21:14

标签: android compilation annotations runtime lint

下面有一个非常简单的类作为示例:

public class Demo {
    private int val;

    public int getVal() {
        return val;
    }

    public void setVal(@IntRange(from = 1, to = 10) int v) {
        val = v;
    }
}

在这里,我正在使用IntRange val 上强制设置范围。当我创建一个新对象并尝试在我的代码中设置一个超出范围的值时,这可以很好地工作。例如:

Demo d = new Demo();
d.setVal(500);  //android studio highlights this as lint-warning

但是,我想在 compile runtime 强制执行此范围验证,并希望在值不在范围内时引发错误。

我该如何实现?

P.S。我知道我可以在更新变量之前在setVal方法中检查范围,但这不是我需要的,而是需要通过android的注释库解决的方法。

1 个答案:

答案 0 :(得分:1)

要在编译时实施发行版的注释,请将 lint.xml 文件添加以下内容到模块的根目录

<lint>
    <issue id="Range" severity="fatal"/> 
</lint>

这样做,您将覆盖“范围”棉绒警告的严重性,并且如果发生此警告,发布版本将失败

可能可以实现一种机制,在运行时强制执行此注释(例如,使用自定义注释处理器),但这要复杂得多,而且不值得花时间

通过注释处理的实现可能如下所示:

带有@IntRange批注的初始类

public class Demo {
    private int val;

    public int getVal() {
        return val;
    }

    public void setVal(@IntRange(from = 1, to = 10) int v) {
        val = v;
    }
}

您可以实现注释处理器,以从初始Demo类生成以下类
(在编译时生成)

public class DemoWithChecks extends Demo {
    public void setVal(int v) {
        if (v >= 1 && v <= 10) {
            super.setVal(v)
        } else {
            //value out of range - throw exception or whatever
        }
    }
}

然后,您可以在代码中使用DemoWithChecks而不是Demo来在运行时强制执行注释检查。

P.S。关于编写自己的注释处理器here

的好文章