以明确的方式有谁能解释之间的实际差别java.lang.annotation.RetentionPolicy
常数SOURCE
,CLASS
和RUNTIME
?
我也不太确定“保留注释”是什么意思。
以明确的方式有谁能解释之间的实际差别java.lang.annotation.RetentionPolicy
常数SOURCE
,CLASS
和RUNTIME
?
我也不太确定“保留注释”是什么意思。
Answers:
RetentionPolicy.SOURCE
:在编译期间丢弃。这些注释在编译完成后没有任何意义,因此它们不会写入字节码。
范例:@Override
,@SuppressWarnings
RetentionPolicy.CLASS
:在上课时放弃。在进行字节码级后处理时很有用。令人惊讶的是,这是默认设置。
RetentionPolicy.RUNTIME
: 不要丢弃。注释应可在运行时反射。例:@Deprecated
来源:
旧的URL现在
已死hunter_meta,并替换为hunter-meta-2-098036。万一出现这种情况,我将上传页面图像。
图像(右键单击并选择“在新选项卡/窗口中打开图像”)
RetentionPolicy.CLASS
apt
已弃用,请参考此docs.oracle.com/javase/7/docs/technotes/guides/apt/…。为了使用反射来发现注释,Internet上有多个教程。你可以寻找到启动java.lang.Class::getAnno*
,并在类似的方法java.lang.reflect.Method
和java.lang.reflect.Field
。
根据您对类反编译的评论,我认为这应该起作用:
RetentionPolicy.SOURCE
:不会出现在反编译类中
RetentionPolicy.CLASS
:出现在反编译类中,但无法在运行时通过反射进行检查 getAnnotations()
RetentionPolicy.RUNTIME
:出现在反编译类中,可以在运行时通过反射进行检查 getAnnotations()
最小的可运行示例
语言等级:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.SOURCE)
@interface RetentionSource {}
@Retention(RetentionPolicy.CLASS)
@interface RetentionClass {}
@Retention(RetentionPolicy.RUNTIME)
@interface RetentionRuntime {}
public static void main(String[] args) {
@RetentionSource
class B {}
assert B.class.getAnnotations().length == 0;
@RetentionClass
class C {}
assert C.class.getAnnotations().length == 0;
@RetentionRuntime
class D {}
assert D.class.getAnnotations().length == 1;
}
字节码级别:使用javap
我们观察到,带Retention.CLASS
注释的类获得了RuntimeInvisible类属性:
#14 = Utf8 LRetentionClass;
[...]
RuntimeInvisibleAnnotations:
0: #14()
而Retention.RUNTIME
批注获取RuntimeVisible类属性:
#14 = Utf8 LRetentionRuntime;
[...]
RuntimeVisibleAnnotations:
0: #14()
并且带Runtime.SOURCE
注释的.class
没有任何注释。
GitHub上的示例供您使用。
保留策略:保留策略确定在什么时候丢弃注释。使用Java的内置注释指定的:@Retention
[关于]
1.SOURCE: annotation retained only in the source file and is discarded
during compilation.
2.CLASS: annotation stored in the .class file during compilation,
not available in the run time.
3.RUNTIME: annotation stored in the .class file and available in the run time.