当我们创建自定义注释时,我们将元素声明为方法,然后将值设置为属性。
例如,我们在这里声明了一个自定义注释ComponentType
,其元素name()
和description()
看起来像方法。
public @interface ComponentType {
String name();// declared as method
String description();
}
使用注释时,它们如下所示:
@ComponentType(name = "userContainer", // value looks like an attribute
description = "a user container")
public class UserEntity { }
我的问题是:为什么Java不允许将元素声明为属性,如下所示?
public @interface ComponentType {
String name; // Compilation Error
String description;
}
答案 0 :(得分:2)
如果注释的属性在界面中没有定义作为抽象方法,那么它们就是成员。类似的东西:
public @interface ComponentType {
String name;
String description;
}
但是,界面中的所有成员都是隐式final
(和static
),上面的代码无法编译,因为name
和description
未初始化。
但如果他们实际上是用一些值初始化的话:
public @interface ComponentType {
String name = "name";
String description = "description";
}
然后就像下面那样的片段是不可能的:
@ComponentType(
name = "userContainer" //cannot assign a value to a final variable
, description = "a user container")
答案 1 :(得分:0)
我的观察是:
Java将注释视为接口的特殊类型,因此:
与界面类似,我们只能在注释中声明最终属性:
String appName = "test application";//final attribute, never reset value
注释可能只包含抽象方法(在没有实现的情况下声明的方法)。
public @interface ComponentType {
String name();// declared as abstract method
当我们通过注释注释元素(例如类,方法,属性)时,我们需要设置那些抽象方法的返回值, 看起来像属性但实际上充当实现。 强>
@ComponentType(name = "userContainer"//set return value of method name()
我们可以通过简单地调用注释的抽象方法来使用我们在注释元素中设置的值(例如,类,方法,属性)。
Annotation annotation = annotatedClassObject.getAnnotation(ComponentType.class);
ComponentType componentType = (ComponentType) annotation;
String someName = componentType.name(); //returns value set during annotating
与界面,
一样期待更多反馈/回答