Java 读取另一个注释中注释的属性
如果以这种方式从类中声明属性:Java 读取另一个注释中注释的属性,java,annotations,Java,Annotations,如果以这种方式从类中声明属性: @Order(value=1) @Input(name="login") private String login; @Input的定义如下: @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface Input { String type() default "text"; String name(); String pattern
@Order(value=1)
@Input(name="login")
private String login;
@Input
的定义如下:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Input {
String type() default "text";
String name();
String pattern() default "";
String tag() default "<custom:Input ordem=''/>";
}
@Retention(RetentionPolicy.RUNTIME)
@目标(ElementType.FIELD)
公共@接口输入{
字符串类型()默认为“文本”;
字符串名();
字符串模式()默认为“”;
字符串标记()默认为“”;
}
是否有任何方法可以从
@Order
读取属性值
,并从@Input
读取属性标记
?读取元数据(如批注、字段和类)的方法之一是反射。您也可以使用反射来读取批注的元数据
仅当@Order
注释具有运行时@Retention(RetentionPolicy.Runtime)的运行时策略时,此操作才有效。
注意:-注释也是类对象。每个注释都是一种特殊类型的接口,接口也被视为java.lang.Class
对象
Field loginVariaable = .../// get your login attribute from your Class Object using reflection
Order order = loginVariaable.getAnnotation(Order.class)
int orderValue = order.value();
Input inputObject = loginVariaable.getAnnotation(Input.class)
String inputName= inputObject.name();
泛型帮助您获得注释对象而不将其转换为注释对象。注意所有注释都隐含扩展<代码> java .ang.注释。注释< /代码>
< p>只考虑好的旧编译时常数:static final int MEANINGFUL_NAME = 1;
@Order(value=MEANINGFUL_NAME)
@Input(name="login", tag="<custom:Input order='"+MEANINGFUL_NAME+"'>")
private String login;
或
你想要实现什么?从
Input.tag的常量default
值中访问login
变量的注释值
?注释Input
怎么可能知道同一字段将有一个@Order
注释,更不用说访问它的值了?我想的是一种“公共区域”,同一字段的注释可以在它们之间共享一些信息。我现在正试着用下面@KumarAbhinav的答案工作。好的,这很接近我想要的。一个问题:我尝试执行您所做的操作(在int value()default WARM;
),但使用字符串值,得到错误注释属性的值必须是常量表达式。这只能使用int
?这也应该可以使用String
s。确保变量为final
并立即赋值,且表达式仅由常量组成。看见
@interface Example {
int COLD = -1, WARM = 0, HOT = 1;
int value() default WARM;
}
@Example(Example.HOT)
import static stackoverflow.Example.*;
// …
@Example(HOT)