在另一个中读取注释的属性

时间:2014-08-18 12:35:52

标签: 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() default "";

    String tag() default "<custom:Input ordem=''/>";

}

有没有办法从value读取属性@Order并使用来自tag的属性@Input

2 个答案:

答案 0 :(得分:1)

读取元数据(如注释,字段和类)的方法之一是Reflection.You也可以使用反射来读取注释的元数据。

仅当@Order注释具有RuntimePolicy of Runtime @Retention(RetentionPolicy.RUNTIME)

时才会有效

注意: - 注释也是Class对象。每个注释是一种特殊类型的接口,接口也被视为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();

Generics可帮助您获取Annotation对象,而无需转换为Annotation Object。另请注意,所有注释都隐式扩展java.lang.annotation.Annotation

答案 1 :(得分:1)

考虑好旧的编译时常量:

static final int MEANINGFUL_NAME = 1;

@Order(value=MEANINGFUL_NAME)
@Input(name="login", tag="<custom:Input order='"+MEANINGFUL_NAME+"'>")
private String login;

在为注释提供值时,编译时常量的规则仍然适用,因此您可以使用其他常量计算常量,并且可以将常量放在其他类中并使用静态导入。它们甚至可以放入注释中,就像其他接口一样,当它们是注释的某种标准值时可能会派上用场。

@interface Example {
  int COLD = -1, WARM = 0, HOT = 1;
  int value() default WARM;
}

...

@Example(Example.HOT)

import static stackoverflow.Example.*;
// …
@Example(HOT)