Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
@Java类型检查器注释的保留_Java_Annotations_Retention_Checker Framework - Fatal编程技术网

@Java类型检查器注释的保留

@Java类型检查器注释的保留,java,annotations,retention,checker-framework,Java,Annotations,Retention,Checker Framework,Java8类型注释(JSR308)允许类型检查器执行静态代码分析。例如,可以通过@NonNull注释检查可能的空值 各种项目都定义了自己的非空注释,例如: org.checkerframew.checker.nullness.qual.NonNull edu.umd.cs.findbugs.annotations.NonNull javax.annotation.Nonnull javax.validation.constraints.NotNull lombok.NonNull org.ec

Java8类型注释(JSR308)允许类型检查器执行静态代码分析。例如,可以通过
@NonNull
注释检查可能的空值

各种项目都定义了自己的非空注释,例如:

  • org.checkerframew.checker.nullness.qual.NonNull
  • edu.umd.cs.findbugs.annotations.NonNull
  • javax.annotation.Nonnull
  • javax.validation.constraints.NotNull
  • lombok.NonNull
  • org.eclipse.jdt.annotation.NonNull
  • 等(见)
对于这样的注释,我希望
@接口
具有,因为它们通常在运行时不需要。最重要的是,代码对相应的库没有任何运行时依赖关系

虽然采用这种方法,但大多数其他非空注释(如
javax.annotation.NonNull
(JSR305)及其本身)都有。在这些注释中使用
RetentionPolicy.RUNTIME
有什么特别的原因吗



澄清:Checker框架支持注释中的注释以实现向后兼容性。然而,在Java 8中使用这些注释只是为了避免运行时依赖性,这似乎是一种肮脏的攻击。

每个注释都有它的目的

javax.validation.constraints.NotNull
这是由bean验证规范定义的,用于在运行时执行非空检查,因此需要在运行时保留它以执行例如表单valdiation

@RetentionPolicy.SOURCE=>通常用于文档 @CLASS=>允许向编译器而不是JVM提供一些信息(例如,在编译期间执行代码生成) @RetentionPolicy.RUNTIME=>允许在JVM级别检索注释信息(因此在运行时)

问候,


这是个好问题

为了在编译时进行静态检查,
CLASS
保留就足够了。请注意,
SOURCE
保留是不够的,因为单独编译:当类型检查类时,编译器需要读取它使用的库上的注释,并且单独编译的库仅作为类文件提供给编译器

注释设计者使用
运行时
保留来允许工具执行运行时操作。这可能包括检查注释(如assert语句)、动态加载代码的类型检查、检查强制转换和
instanceof
操作、更精确地解析反射等等。现在这种工具并不多,但注释设计者希望在将来能够适应它们

您注意到,对于
@Retention(RetentionPolicy.CLASS)
,“代码对相应的库没有任何运行时依赖关系。”对于
@Retention(RetentionPolicy.runtime)
,事实上也是如此!请参阅此堆栈溢出问题:

总之,使用
保留在运行时花费的空间可以忽略不计,可以在将来实现更多的潜在用途,并且不会引入运行时依赖性


对于Checker框架,它提供了运行时测试,例如。如果您的代码使用这些方法,那么您的代码将依赖于Checker Framework运行时库(该库比整个Checker Framework本身小,并且具有更宽松的许可证)。

Yes
javax.validation.constraints.NotNull
具有运行时用途。但是
javax.annotation.Nonnull
org.checkerframework.checker.nullness.qual.Nonnull
没有运行时用途。您的问题没有全局答案,由注释的创建者定义是否需要在运行时保留。请参阅此SOW线程以获取一些提示:使用mockito(版本2.2.0)模拟带注释类的相关说明:而RetentionPolicy.RUNTIME意味着二进制文件中的注释不必在运行时可用,在模拟类路径上没有注释的带注释类时,在Java 8中导致NullPointerException。