如果我以这种方式从我的班级声明属性:
@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
?
答案 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)