注解在运行时到底是什么?怎么继承、重复、读取?这篇一项项验证(RetentionPolicy 三种策略的基本读取已有专门文章,这里补充代理对象、继承、重复、位置与开销)。
注解实例的类:$ProxyN,Proxy.isProxyClass = true,annotationType() = Info
toString() = @Main.Info(name="svc", level=3, tags={"a", "b"})
Child 上能读到 @Info 吗(@Info 没有 @Inherited):false
只写 @Info、不给成员值 → name = anon,level = 1,tags 长度 = 0
equals:同一个注解两次读取 equals = true,是同一个对象 = true,hashCode 相等 = true@Marker 有 @Inherited,Base 上有 @Marker:Child.class.getAnnotation(Marker) = @Main.Marker(v="base");getDeclaredAnnotation = null 接口上的 @Marker(Impl implements I):Impl.class.getAnnotation(Marker) = null(类注解的继承只沿父类,不沿接口) 方法上的 @Marker:Base.m 有 = true,覆盖它的 Child.m 有 = false(方法注解不继承)
@Tag 可重复。One(写了 1 个 @Tag):getAnnotation(Tag) = @Main.Tag("only"),getAnnotationsByType 长度 = 1
Two(写了 2 个 @Tag):getAnnotation(Tag) = null(被编译器包进了容器注解 @Tags),getAnnotation(Tags) 不为 null:true,getAnnotationsByType(Tag) 长度 = 2
Two.class.getAnnotations() 里的类型:[Tags] Three 上的注解(运行时可见的):[Rt](@Cl 是 CLASS、@Src 是 SOURCE,读不到)
方法 f 的参数注解:第 1 个参数 [@Main.Info(name="p", level=1, tags={})],第 2 个参数 []
TYPE_USE 注解 List<@NonNull String>:类型参数上的注解 = [@Main.NonNull()]
Field.getAnnotations()(普通声明注解)= [](TYPE_USE 注解不算声明注解)第一次 getAnnotation:12626 µs;第二次:0 µs;连续 100 万次平均 17 ns/次;读注解成员 name() 100 万次平均 8 ns/次
RuntimeVisibleAnnotations: ['0: #26()', 'Main$Rt']
RuntimeInvisibleAnnotations: ['0: #28()', 'Main$Cl']
RuntimeVisibleParameterAnnotations: ['parameter 0:', '0: #20(#21=s#22)', 'Main$Info(']
RuntimeVisibleTypeAnnotations: ['0: #14(): FIELD, location=[TYPE_ARGUMENT(0)]', 'Main$NonNull']