注释基本上是可以附加到字段,方法,类等的数据位。
在Java中声明注释的语法有点尴尬。它们看起来有点像接口(毕竟是用声明的
@interface),但它们并不是真正的接口。我认为您可能已将该
doTestTarget()方法放入您的
TestAnnotations类中,因为您认为注释是接口并且需要实现它。这不是正确的-
您可以删除此方法,并且可以根据需要从代码中对其进行调用,这样做不会给您带来任何问题。
另外,您可能无意将注释放在字段上
str。注释仅适用于紧随其后的内容。结果,您的代码无法编译,因为您已将注释应用于字段,但声明只能将注释应用于方法。更改
@Target(ElementType.METHOD)为
@Target(ElementType.FIELD),然后应编译您的代码。
至于字符串发生了什么
Hello World!,它将被写入.class文件,并且可用于读取Java类的任何工具。但是,它不一定在运行时在JVM中可用。发生这种情况是因为您没有
@Retention为
@Test_Target注释指定。为默认值
@Retention是
RetentionPolicy.CLASS,这意味着JVM大可不必去加载出来的类文件。(有关RetentionPolicy枚举,请参见Javadoc。)
我想您想看到一种在运行时从此批注中读取值的方法。如果是这样,我建议您添加
@Retention(RetentionPolicy.RUNTIME)注释,以确保它在运行时可用。
要在运行时访问注释及其中包含的值,您需要使用反射。我已经
TestAnnotations按照以下步骤重写了您的课程,以进行快速演示:
import java.lang.reflect.Field;public class TestAnnotations { @Test_Target(doTestTarget="Hello World !") private String str; public static void main(String[] args) throws Exception { // We need to use getDeclaredField here since the field is private. Field field = TestAnnotations.class.getDeclaredField("str"); Test_Target ann = field.getAnnotation(Test_Target.class); if (ann != null) { System.out.println(ann.doTestTarget()); } }}
当我运行此代码时,它将为我提供以下输出:
你好,世界 !
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)