Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 注释保留策略:声明'SOURCE'或'CLASS'有什么真正的好处?_Java_Annotations - Fatal编程技术网

Java 注释保留策略:声明'SOURCE'或'CLASS'有什么真正的好处?

Java 注释保留策略:声明'SOURCE'或'CLASS'有什么真正的好处?,java,annotations,Java,Annotations,我知道Java注释有三种保留策略: 类:编译器将注释记录在类文件中,但VM不需要在运行时保留注释 运行时:编译器将注释记录在类文件中,并在运行时由VM保留,因此可以反射地读取注释 来源:编译器将丢弃注释 虽然我了解它们的使用场景,但我不明白为什么指定保留策略如此重要,以至于保留策略根本不存在 我是说,为什么不是所有的注释都保存在运行时?它们是否生成了如此多的字节码/占用了如此多的内存,以至于剥离那些未声明为运行时的字节码会产生如此大的差异?保留策略源是为了帮助IDE、编译器以及可能的代码/文档生

我知道Java注释有三种保留策略:

类:编译器将注释记录在类文件中,但VM不需要在运行时保留注释

运行时:编译器将注释记录在类文件中,并在运行时由VM保留,因此可以反射地读取注释

来源:编译器将丢弃注释

虽然我了解它们的使用场景,但我不明白为什么指定保留策略如此重要,以至于保留策略根本不存在


我是说,为什么不是所有的注释都保存在运行时?它们是否生成了如此多的字节码/占用了如此多的内存,以至于剥离那些未声明为
运行时的字节码会产生如此大的差异?

保留策略源是为了帮助IDE、编译器以及可能的代码/文档生成器利用注释。这些注释不构成已编译类的一部分,并且被编译器丢弃,因此在运行时不可用

例如,注释
java.lang.SuppressWarnings
告诉编译器不要报告某些警告

用于生成文档的注释可以是保留策略源的注释


看看这篇文章/答案

来真正回答这个问题:减少依赖性。如果在源代码和运行时之间没有区别,则类的“用户”必须提供注释来自的所有依赖项。因此,只有当IDE(源代码)使用注释时,才会在运行时提供jar,这是不必要的。如果您试图从一个类中获取注释,而该类中没有提供实际提供注释的jar,那么您将得到一个类not found exception。

我猜如果您有很多注释,它们可能会在类文件中占用大量空间,因此Java允许您指定在运行时不需要特定注释,因此它可以被丢弃。
SOURCE
保留注释可用于禁用IDE中的警告,如f.e
@superswarnings
,而
保留注释在处理字节码(或像javassist这样的字节码操作框架)时非常有用在字节通过类加载器实际加载到VM之前。一般的意图就像在OOP中一样,尽可能地限制注释的范围——尽管在实践中,大多数注释都有保留
运行时
,因为大多数程序员可能不关心或不想使用反射来检查注释是否可用p,这一点我很清楚。我不明白的是,在运行时保留所有保留会有什么错,这使得设计者提供了这些策略。但是我想我对我得到的评论几乎感到满意。如果它不是为运行时访问而设计的,并且在那个时候它将是无用的,那么在运行时包含它们是没有必要的。源注释直接在源文件(.java)上处理,而不是在类文件上处理。所以,我不认为将它们存储在编译类上或在运行时加载有什么意义。JVM忽略了错误的、未知的注释。但是,Java 5的早期版本中存在一个bug,它们没有被忽略: