IDEA对jsr305的Nonnull注解和Guava的Beta注解的支持
前言
jsr305是一个规范,具体来说是一套用来给代码分析工具(如IDEA)检查代码缺陷用的注解,类似jsr303(Bean Validation规范)。今天在学习Spring源码时,发现其中使用到了jsr305中的注解。
Spring中的NonNull注解中使用到了jsr305中的Nonnull注解,可以看做是对Nonnull注解的一个封装。
IDEA对jsr305注解的支持
引入jsr305和spring核心的maven依赖
复制<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
<version>3.0.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.1.RELEASE</version>
</dependency>
测试代码
复制import org.springframework.lang.NonNull;
public class Client2 {
@NonNull
private static String test() {
return null;
}
}
这种情况IDEA就会有警告,提示方法返回结果可能为null
原理
那么IDEA是如何认识Spring的注解的呢,查找得知,IDEA应该不认识Spring的注解,但它认识jsr305的注解,而Spring注解NonNull中使用到了jsr305的注解javax.annotation.Nonnull类。
复制/**
* A common Spring annotation to declare that annotated elements cannot be {@code null}.
*
* <p>Leverages JSR-305 meta-annotations to indicate nullability in Java to common
* tools with JSR-305 support and used by Kotlin to infer nullability of Spring API.
*
* <p>Should be used at parameter, return value, and field level. Method overrides should
* repeat parent {@code @NonNull} annotations unless they behave differently.
*/
@Target({ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Nonnull
@TypeQualifierNickname
public @interface NonNull {
}

可以看到,IDEA本身配置了一些关于代码分析的注解,其中就包括了jsr305的javax.annotation.Nonnull注解。
自定义检查注解
我们也可以配置我们自定义的注解。
复制import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyNonnull {
}
将自定义注解添加到配置中

可以看到,自定义注解在代码中也是生效的。
IDEA对Guava的Beta注解的支持
引入Guava的maven依赖
复制<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>27.1-jre</version>
</dependency>
代码测试
复制import com.google.common.io.ByteStreams;
public class Client3 {
public static void main(String[] args) {
System.out.println(ByteStreams.nullOutputStream());
}
}
IDEA会有代码警告,因为ByteStreams的nullOutputStream()方法被@Beta注解修饰。
原理

IDEA本身配置了一些关于不稳定API的注解,只要被这些注解修饰,IDEA就会有代码提示。
总结
上述两个功能只是IDEA的代码检查提供功能的很小一部分,更多关于IDEA的代码检查的信息,可以查看 Code inspections。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)