Java注释处理工具@NoNull

时间:2012-09-04 20:53:09

标签: java apt

我想创建一个注释,限制开发人员将 null 指定为参数,该参数已使用 @NoNull

进行注释

例如,如果我创建此方法:

public void printLine(@NoNull String line) {
    System.out.println(line);
}

在方法调用中,如果用户为指定 null ,我想要出现错误:printLine(null);

我一直在使用APT一段时间,我想知道如何做到这一点(如果可能的话)?

这是我到目前为止创建的注释:

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.SOURCE)
public @interface NoNull {}

3 个答案:

答案 0 :(得分:3)

编译时间很难检查,因为你真的在处理运行时值。如果你想创建注释来自动添加代码来检查这些东西,你应该看一下项目lombok:

http://projectlombok.org/

它使用注释处理器向bean添加代码以执行各种操作。

例如:

@Getter @Setter
private int id;

注释处理器会自动将get / set方法添加到bean中。

我认为它没有空检查,但你应该可以添加它并贡献它。

另一种选择是使用验证jsr,虽然这要求您在运行时显式验证,但您可以使用代理或AOP来完成此操作。

@NotNull @Min(1)
public void setId(Integer id)

答案 1 :(得分:2)

  

关键是不仅仅为了可读性而使用注释,而是在编译时使用APT强制执行注释

考虑到null是一个运行时工件,我不知道你将如何在“编译时”强制执行空检查。

相反,你必须修改你的类, apt 不是这样做的工具,至少不是它本身。存在从源文件中提取有关注释元素的信息。但要强制执行@Null限制,您需要修改正在运行的类。

您可以做的一件事是使用 apt 提取有关注释参数的信息,然后使用 aspectj 之类的工具在运行时修改这些类以检查参数值

但对于一个单独的问题,这个话题太宽泛了。

答案 2 :(得分:0)

@Nullable,@ Nonnull位于包中:javax.annotation

结账番石榴,它有一些不错的东西是类型安全: http://code.google.com/p/guava-libraries/wiki/GuavaExplained