相关疑难解决方法(0)

不同的保留策略如何影响我的注释?

以明确的方式有谁能解释之间的实际差别java.lang.annotation.RetentionPolicy常数SOURCE,CLASSRUNTIME

我也不完全确定"保留注释"这个短语是什么意思.

java annotations

167
推荐指数
4
解决办法
6万
查看次数

为什么缺少注释不会在运行时导致ClassNotFoundException?

请考虑以下代码:

A.java:

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
@interface A{}
Run Code Online (Sandbox Code Playgroud)

C.java:

import java.util.*;

@A public class C {
        public static void main(String[] args){
                System.out.println(Arrays.toString(C.class.getAnnotations()));
        }
}
Run Code Online (Sandbox Code Playgroud)

编译和运行按预期工作:

$ javac *.java
$ java -cp . C
[@A()]
Run Code Online (Sandbox Code Playgroud)

但是考虑一下:

$ rm A.class
$ java -cp . C
[]
Run Code Online (Sandbox Code Playgroud)

我会期望它抛出一个ClassNotFoundException,因为@A缺少.但相反,它会默默地删除注释.

这种行为是在JLS的某个地方记录的,还是Sun的JVM的怪癖?它的基本原理是什么?

这样的事情似乎很方便javax.annotation.Nonnull(看起来应该是这样@Retention(CLASS)的)但是对于许多其他注释来说,似乎它可能会导致在运行时发生各种不好的事情.

java annotations

82
推荐指数
3
解决办法
1万
查看次数

标签 统计

annotations ×2

java ×2