Java 在注释声明中定义枚举和字段的意义是什么?

Java 在注释声明中定义枚举和字段的意义是什么?,java,Java,在Java中,似乎可以在注释声明中声明字段和枚举。例如,javac编译如下: @interface ClassPreamble { public enum AnEnum { Value; } String aField = ""; String author(); String date(); String currentRevision() default ""; String lastModified() default "N/A

在Java中,似乎可以在注释声明中声明字段和枚举。例如,javac编译如下:

 @interface ClassPreamble {
   public enum AnEnum {
        Value;
   }
   String aField = "";

   String author();
   String date();
   String currentRevision() default "";
   String lastModified() default "N/A";
   String lastModifiedBy() default "N/A";
   // Note use of array
   String[] reviewers();
}
在注释声明中定义枚举和字段的意义/用途是什么


谢谢

Java注释只是继承了
Java.lang.annotation.annotation
(*)的接口,并且在一定程度上受到编译器的特殊处理,但是编译器不会阻止您在接口内做任何合法的事情。它甚至可能很有用(请参见本答案底部JLS中的示例)

(*)尽管手动扩展
注释
的接口没有定义注释类型(来源:for
Annotation.java

您的注释
ClassPreamble
实际上是
接口ClassPreamble扩展了java.lang.annotation.annotation
(对其进行反编译以查看)

在接口中声明枚举是合法的。 在接口中声明字段是合法的:它将隐式地公开静态final

$ cat Funny.java 
interface Funny {
  public enum AnEnum { One, Two }
  String aField = "";
}

$ javac Funny.java 

$ javap -c Funny.class
Compiled from "Funny.java"
interface Funny extends java.lang.annotation.Annotation {
  public static final java.lang.String aField;

}

$ javap -c Funny\$AnEnum.class | head
Compiled from "Funny.java"
public final class Funny$AnEnum extends java.lang.Enum<Funny$AnEnum> {
  public static final Funny$AnEnum One;

  public static final Funny$AnEnum Two;

  public static Funny$AnEnum[] values();
    Code:
       0: getstatic     #1                  // Field $VALUES:[LFunny$AnEnum;
       3: invokevirtual #2                  // Method "[LFunny$AnEnum;".clone:()Ljava/lang/Object;
...

请仔细阅读我的问题。我知道注释是多么有用。我只是不知道在注释声明中定义字段和枚举有多有用。是的,我是说这个链接给出了一个例子。@OliverCharlesworth我检查了所有这些页面,没有注释声明定义像上面那样的枚举或字段的例子(例如,
AnEnum
aField
)抱歉,我确实误读了“方法”的“字段”:/是的,似乎接口编译器基础结构被黑客攻击以支持注释,而黑客攻击没有完成。例如,如果执行
Level value()default interference
,则
质量
将失败,并出现编译错误,这似乎是一个本应支持的非常有效的用法。我很好奇,因为我从未见过这样的注释声明示例。我已经怀疑这是一个“黑客”案件,我会接受你的回答正确且已接受OK,不记得尝试过。很高兴知道这一点!
@interface Quality {
    enum Level { BAD, INDIFFERENT, GOOD }
    Level value();
}