3

是否有任何 java 注释用于向类的字段添加额外信息?

我需要类似以下示例的内容,以便在运行时通过反射访问:

public class A
{
   @Description("my field")
   public String name = "";
}
4

1 回答 1

7

自己写这样的东西并不难。例如:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Description {
    String value() default "";
}

然后使用它:

public class MyClass {

    @Description("my field")
    private String name = "";
}

并获得value

Field nameField = MyClass.class.getDeclaredField("name");
Description d = nameField.getAnnotation(Description.class);
System.out.println(d.value()); // Prints "my field"

关键部分:

  • 请注意,这value是一个特殊属性。它不需要您指定名称。如果您不使用value,则必须做一些类似@Description(desc = "my field")的事情并直接引用它的名称。
  • default指定默认值。在这里没有多大意义,但知道它很有用。这意味着您可以@Description在没有value指定的情况下编写,这将是合法的。在这种情况下,调用value()将返回空字符串,因为这是默认值。如果您没有指定默认值,那么您需要提供一个值。
  • @Target用于指定注释可以用于哪种元素。在这种情况下,我们仅指定FIELD.
  • @Retention指定它保留多长时间以及是否可以访问它。SOURCE表示编译后丢失。当您只需要它进行注释处理时,这很有用。CLASS表示它存储在字节码中,但您无法通过反射访问它。RUNTIME与 相同CLASS,只是您可以通过反射访问它。
于 2013-10-29T06:55:17.743 回答