关于 spring 注解 Nullable 使用的困惑

2021-01-05 09:21:31 +08:00
 JCJD
package org.springframework.lang;

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;

// 在我的项目中未引入下面三个依赖
import javax.annotation.Nonnull;
import javax.annotation.meta.TypeQualifierNickname;
import javax.annotation.meta.When;

@Target({ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Nonnull(when = When.MAYBE)
@TypeQualifierNickname
public @interface Nullable {
}

在缺少 javax.annotation.Nonnulljavax.annotation.meta.TypeQualifierNicknamejavax.annotation.meta.When 类的情况下,Nullable依然可以正常使用,而不会出现类似'ClassNotFoundException'的错误,这是为什么呢?

1169 次点击
所在节点    问与答
4 条回复
TtTtTtT
2021-01-05 10:17:01 +08:00
简而言之,就是你使用 Nullable 这个注解,创建它的实例时,并不需要使用这几个注解。
这些注解是标注在 Nullable 类上的元数据,只有在读取 Class<Nullable>的注解时才有可能实例化你说的这三个依赖(这取决于这三个注解是不是能在运行时被实例化,详见 @Retention )。
liuxey
2021-01-05 10:26:21 +08:00
全局搜一下呢,可能你没有直接引用,但其他包可能会引用

我查了下这是 JSR305 里的东西,比如: https://mvnrepository.com/artifact/com.google.code.findbugs/jsr305
yannxia
2021-01-05 10:27:16 +08:00
找到了题主的英文问题: https://stackoverflow.com/questions/65561493/i-have-a-problem-with-springs-nullable-annotaion

也找到了答案: https://stackoverflow.com/questions/3567413/why-doesnt-a-missing-annotation-cause-a-classnotfoundexception-at-runtime/3568041

大概意思也就是 这个 MetaAnnoation 只是一个标记,在反射的时候不存在也不会报错 == 没有
wangxiaoaer
2021-01-05 10:48:11 +08:00
心疼题主,竟然被踩,帮你点了个赞。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/741723

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX