当前位置: 首页 > 知识库问答 >
问题:

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

蓬化
2023-03-14

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

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

  • org。棋盘格框架。检验员零度。夸尔。非空
  • edu。umd。反恐精英。芬德布格斯。注释。非空
  • javax。注释。非空
  • javax。验证。限制。NotNull
  • lombok。非空
  • org。日食jdt。注释。非空
  • 等(参见《检查框架手册》第3.7节)

对于此类注释,我希望@接口具有@保留(RetentionPolicy.CLASS),因为它们通常在运行时不需要。最重要的是,代码对相应的库没有任何运行时依赖关系。

虽然org.eclipse.jdt.annotation.NonNull遵循这种方法,但大多数其他的NonNull注释,如javax.annotation.Nonnull(JSR305)和org.checkerframework.checker.nullness.qual.NonNull本身,都具有@保持(Retention策略)。运行时间)。是否有任何特定的原因RetentionStrategy.在这些注释中运行时间

说明:Checker框架支持注释中的注释,以实现向后兼容。然而,使用Java8中的那些只是为了避免运行时依赖似乎是一个肮脏的黑客。

共有2个答案

陆宾白
2023-03-14

每个注释都有它的用途!

javax.validation.constraints.NotNull

这些由bean验证规范定义,用于在运行时执行非空检查,因此需要在运行时保留这些检查以执行例如表单验证...

@保留政策。来源=

祝好

洛伊克

熊博远
2023-03-14

这是一个好问题。

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

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

您注意到,对于@Retention(RetentionPolicy.CLASS),代码对相应的库没有任何运行时依赖关系这在@Retention(RetentionPolicy.RUNTIME)中也是如此!请参阅此堆栈溢出问题:为什么缺少注释不会在运行时导致ClassNotFoundException。

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

在Checker框架的情况下,它提供了运行时测试,例如isRegex(String)。如果您的代码使用这样的方法,您的代码将依赖于Checker框架运行库(它比整个Checker框架本身更小,并且具有更宽松的许可证)。

 类似资料:
  • 我正在使用注释处理器来处理方法参数的注释。 用于参数的注释类型有一个注释@参数 现在,当注释处理器运行时,我想检查参数注释()是否有参数注释。我通过执行以下代码来实现这一点。 由于某种原因,arg始终为空。是否有注释未返回的原因?

  • 本文向大家介绍Java注释的类型。,包括了Java注释的类型。的使用技巧和注意事项,需要的朋友参考一下 Java支持单行,多行注释和文档注释。Javadoc工具可以理解文档注释,并可用于创建基于HTML的文档。 / **被称为文档注释。Javadoc工具在为程序代码创建文档时使用它。 / *用于多行注释。 //用于单行注释 示例

  • 问题内容: 我正在使用反射来查看附加到类的属性的注释是否具有特定类型。目前我正在做: 这让我有些不高兴,因为它依赖于完全合格的类名称的字符串。如果将来更改命名空间,则可能会导致细微的错误。 我想要做: 但是是抽象类,无法实例化。有没有一种方法可以针对接口或抽象类进行模拟(或基本上使用)? 问题答案: 你只是在寻找 ?

  • 我正在阅读有关java注释的信息,出现了一个新的疑问。 在文档中解释功能接口注释类型: 带有一个抽象方法声明的接口称为函数式interface.The编译器验证所有使用@FunctionalInterface注释的接口是否真正包含一个且仅包含一个抽象方法。如果使用此注释注释的接口不是函数式接口,则会生成编译时错误。在类、注释类型和枚举上使用此注释也是编译时错误。FunctionalInterfac

  • 我有一个包含三个字段的表,比如a、b、c。我想添加一个约束,确保如果a不为null,那么b和c也不为null。我已经使用以下SQL完成了这项工作 使用hibernate注解@Check有没有办法达到同样的效果? 我找不到一个有用的注释示例,开发人员倾向于根本不使用它吗?

  • Struts 2 应用程序可以使用Java5注释作为替代XML和Java属性配置。这里是清单的不同的类别有关的最重要的注解: 命名空间注释(动作注释): @ Namespace注释允许在Action类中,而不是基于零配置的约定动作的命名空间的定义。 结果注释 - (动作译注): @ Result注解允许在Action类中,而不是一个XML文件中定义的动作结果。 结果注释 - (动作译注): @ R