【发布时间】:2023-03-24 03:04:01
【问题描述】:
我想我更深入地研究了旧的 Java 功能,例如注解。我遇到了 Java 8s Type Annotations,它使我们能够扩展 Javas 类型系统。 IntelliJ 的注释库或 Checkerframework 最常见的注释 'NonNull' 或 'NotNull' 对我来说仍然是个谜。在文档中,我只能找到接口的声明,但找不到 Annotation 处理器是如何实现的。 我喜欢编写自己的自定义注释,在编译时检查特定类型,但我不知道如何开始。
有人知道“NonNull”或“NotNull”通常是如何在 Annotation 处理器中实现的吗?。 或者将我指向可以回答我的问题的资源或文档?
非常感谢您的帮助。
【问题讨论】:
-
@Slaw 你能详细说明一下吗?我已经使用 java 注释处理 API 成功编写了一个自定义注释。我知道如何使用处理器,但我不明白如何确保 nullobjects 或
Objects 的类型安全 -
您到底想发生什么?诸如 SpotBugs 之类的工具在运行时不做任何事情,而是检查编译后的代码中的错误并使用某些注释来帮助确定应该或不应该允许什么。我相信,其他工具(例如 Project Lombok)实际上会在编译期间修改您的代码,以便插入诸如空检查之类的代码。还可以选择在运行时修改类(例如,通过自定义
ClassLoader或检测)。 -
还有其他库,例如 Bean Validation 规范及其实现,可能会使用反射在运行时检查注释以控制执行流程。
-
所以您想创建一个代码分析器,在编译时使用
javax.annotation.processing.Processor分析您的代码,对吗?您可能无法使用java.compilerAPI 做很多事情,可能不得不使用jdk.compilerAPI。java.compilerAPI 更适合代码生成和可能的签名验证。无论如何,解释如何编写源代码分析器非常广泛——即使我知道的足够多,可以给出正确的解释。 -
您可以尝试查看诸如 SpotBugs、PMD、Checker Framework 等开源工具,以了解它们是如何实现这些功能的。一种可能特别有用的工具是 Google 的 Error Prone。
标签: java annotations javac