当前位置: 首页 > 面试题库 >

了解Java中的注释

澹台锐
2023-03-14
问题内容

我试图通过一些在线材料来学习Java中的注释。

在下面的代码,发生了什么事我亲爱的“Hello World”的字符串,我在这行通过:@Test_Target(doTestTarget="Hello World !")

@Target(ElementType.METHOD)
public @interface Test_Target {
   public String doTestTarget();
}

上面是定义的注释,下面是其用法

public class TestAnnotations {
   @Test_Target(doTestTarget="Hello World !")
   private String str;
   public static void main(String arg[]) {
      new TestAnnotations().doTestTarget();
   }
   public void doTestTarget() {
      System.out.printf("Testing Target annotation");
   }
}

当我运行此代码时,它只是打印 Testing Target annotation

请帮帮我,我完全不了解注释。


问题答案:

注释基本上是可以附加到字段,方法,类等的数据位。

在Java中声明注释的语法有点尴尬。它们看起来有点像接口(毕竟是用声明的@interface),但它们并不是真正的接口。我认为您可能已将该doTestTarget()方法放入您的TestAnnotations类中,因为您认为注释是接口并且需要实现它。这不是正确的-
您可以删除此方法,并且可以根据需要从代码中对其进行调用,这样做不会给您带来任何问题。

另外,您可能无意将注释放在字段上str。注释仅适用于紧随其后的内容。结果,您的代码无法编译,因为您已将注释应用于字段,但声明只能将注释应用于方法。更改@Target(ElementType.METHOD)@Target(ElementType.FIELD),然后应编译您的代码。

至于字符串发生了什么Hello World !,它将被写入.class文件,并且可用于读取Java类的任何工具。但是,它不一定在运行时在JVM中可用。发生这种情况是因为您没有@Retention@Test_Target注释指定。为默认值@RetentionRetentionPolicy.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());
      }
   }
}

当我运行此代码时,它将为我提供以下输出:

你好,世界 !


 类似资料:
  • 问题内容: 我试图了解JPA 中注释的属性。我在下面的示例中创建了一个客户具有订单列表的示例: 现在,当我使用Hibernate生成表时,我看到Hibernate仅创建了2个表: 另外,如果我尝试保存客户和一些订单,我会在下面看到由Hibernate生成的DML语句: 为什么Hibernate试图在TBL_ORDER中插入和更新记录,而不仅仅是运行单个插入查询? 现在,如果我删除mapledBy属

  • 本文向大家介绍全面解析Java中的注解与注释,包括了全面解析Java中的注解与注释的使用技巧和注意事项,需要的朋友参考一下 注解 一、什么是 Annotation? (注解 or 注释) Annotation, 准确的翻译应该是 -- 注解。 和注释的作用完全不一样。 Annotation 是JDK5.0及以后版本引入的一个特性。 与类、接口、枚举是在同一个层次,可以成为java 的一个类型。 语

  • 问题内容: 我知道使用这种克隆机制并不是一个好主意(因为它被某些作者建议“破了”),尽管我需要帮助来理解它的工作原理。我们得到以下类层次结构: 既然扩展了,如何返回一个实例?实际上是返回对class对象的引用。为什么我们可以将其投射到?有不在班上的成员。默认行为实际上是如何设法自动克隆此变量的(因为该变量在class中没有记录)? 同样,M也是如此。在我们中,将一个对象从class (由返回)转换

  • 问题内容: 有一个结构。我想以这种方式链接这三个实体:公司应包含ID,公司名称和部门列表,每个部门都有一个工人列表,ID和部门名称。每个工人都有名字,身份证。 我试图与一对多和多对一建立联系,但未成功。 公司 部 工人 我从开始: 它填充公司,但不填充其他表,也没有创建任何联接(映射)错误: 问题答案: 除了Glenn Lane的答案中提到的级联,您还需要了解双向关联是如何工作的。 它们有一个所有

  • 本文向大家介绍java 中@Deprecated 注解的实例详解,包括了java 中@Deprecated 注解的实例详解的使用技巧和注意事项,需要的朋友参考一下 java 中@Deprecated 注解的实例详解 1 简介   Deprecated 同 SuppressWarnings 一样,都是 J2SE 5.0 中定义在Java.lang包中的标准 Annotation 之一,其可以标注在类

  • 问题内容: 我是一个Android初学者。在尝试管理活动生命周期的代码时,我遇到了新问题。 我对代码理解得很好,但是在ActionBar SuppressLint中却给出了错误。当我双击它时,正在添加。这是什么意思? 问题答案: 是Android Lint工具使用的注释。 当代码中的某些内容不是最佳的或可能崩溃时,Lint会告诉您。通过传递,您将抑制所有警告,这些警告会告诉您是否正在使用在您的设备