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

标签 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;
    }
}

在这里,我使用 IntRangeval 上强制执行一个范围。当我创建一个新对象并尝试在我的代码中设置一个超出范围的值时,这很好用。例如:

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

但是,我想在编译运行时 强制执行此范围验证,并希望在值不在范围内时抛出错误。

我怎样才能做到这一点?

附言我知道我可以在更新我的变量之前在 setVal 方法中检查范围,但这不是我要处理的,我希望通过 android 的注释库找到解决方案。

最佳答案

要在编译时发布版本强制执行此注释,请将具有以下内容的lint.xml文件添加到模块的根目录

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

通过这样做,您可以覆盖“Range”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 以在运行时强制执行注释检查。

附言关于编写自己的注释处理器的好文章 here

关于android - 在编译/运行时强制执行 android 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52870881/

相关文章:

annotations - 如何比较验证中的日期?

java - 过滤ArrayList并删除不需要的元素

java - 签署 Android 应用程序时出现 Proguard 错误/Dalvik 错误 1

android - 如何获取 Cygwin 中当前工作命令的列表?

c++ - 将库添加到调试配置 - QtCreator、VC 编译器

emacs - 在 emacs 中使用两个框架时,如何防止编译缓冲区同时出现在两个框架中?

javascript - Webview 无法在 Oreo 上加载

c - 如何让我的程序在没有警告的情况下编译?

注释掉代码的 Java 注解

hibernate - 我可以为 @Entity 定义默认顺序吗?