ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

@Retention Java类型检查器注释

2019-08-28 23:13:50  阅读:243  来源: 互联网

标签:java annotations retention checker-framework


Java 8类型注释(JSR 308)允许类型检查器执行静态代码分析.例如,The Checker Framework可以通过@NonNull注释检查可能的空值.

各种项目定义自己的NonNull注释,例如:

> org.checkerframework.checker.nullness.qual.NonNull
> edu.umd.cs.findbugs.annotations.NonNull
> javax.annotation.Nonnull
> javax.validation.constraints.NotNull
> lombok.NonNull
> org.eclipse.jdt.annotation.NonNull
>等(见The Checker Framework Manual, section 3.7)

对于这样的注释,我希望@interface具有@Retention(RetentionPolicy.CLASS),因为它们通常在运行时不需要.最重要的是,代码对相应的库没有任何运行时依赖性.

虽然org.eclipse.jdt.annotation.NonNull遵循这种方法,但大多数其他NonNull注释(如javax.annotation.Nonnull(JSR 305)和org.checkerframework.checker.nullness.qual.NonNull本身)都有@Retention(RetentionPolicy.RUNTIME).这些注释中RetentionPolicy.RUNTIME是否有任何特殊原因?

澄清:Checker Framework支持注释中的注释以实现向后兼容性.但是,使用Java 8中的那些只是为了避免运行时依赖性似乎是一个肮脏的黑客.

解决方法:

这是一个很好的问题.

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

注释设计者使用RUNTIME保留来允许工具执行运行时操作.这可能包括检查注释(如断言语句),动态加载代码的类型检查,检查转换和操作实例,更精确地解析反射等等.目前存在的工具并不多,但注释设计师希望将来能够适应它们.

您注意到使用@Retention(RetentionPolicy.CLASS),“代码对相应的库没有任何运行时依赖性.”这实际上也适用于@Retention(RetentionPolicy.RUNTIME)!请参阅此Stack Overflow问题:
Why doesn’t a missing annotation cause a ClassNotFoundException at runtime?

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

对于Checker Framework,它提供运行时测试,如isRegex(String).如果您的代码使用此类方法,您的代码将依赖于Checker Framework运行时库(小于整个Checker Framework本身).

标签:java,annotations,retention,checker-framework
来源: https://codeday.me/bug/20190828/1756671.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有