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)