使用注释值获取属性

时间:2014-10-29 15:51:32

标签: java annotations

我想使用以下类的方法 execute()

public class Parser {
    @Header("header1")
    private String attribute1;

    @Header("header2")
    private String attribute2;

    @Header("header3")
    private String attribute3;

    @Header("header4")
    private String attribute4;

    public String execute(String headerValue) {
        //Execute
    }
}

我希望此方法实现的是将 headerValue 参数与 @Header 注释列表中的一个匹配,并返回相应属性的值。例如,如果我调用 execute(" header3"),它应该返回 attribute3 的值

我怎样才能做到这一点?或者这是编码此要求的更好方法吗?

3 个答案:

答案 0 :(得分:0)

为什么不直接使用地图?无论如何你需要一个将注释参数值的映射存储到字段中,但是如果你可以在没有反射的情况下做到这一点,那么它应该更容易编码和维护。

我的意思是:

Map<String, String> attributes; //initialized

attributes.put("header1", value1);
...

execute()中,您只需访问地图。

您可以使用枚举来改善这一点,例如:为了限制可能值的数量。

这样的事情:

enum HeaderType {
  HEADER1,
  HEADER2,
  ...
}

private Map<HeaderType, String> headerAttribs = ...;

void setAttrib( HeaderType type, String value ) {
  headerAttribs.put(type, value);
}

String getAttrib( HeaderType type ) {
  return headerAttribs.get(type);
}

public String execute(HeaderType type ) {
    //Execute
}

如果你需要为标题类型使用字符串,你可以考虑使用额外的map string-&gt;标题类型来首先查找正确的类型。

或者你可以使用switch语句,因为Java 7也应该使用字符串。

答案 1 :(得分:0)

试试这个:

public String execute(String headerValue) throws IllegalArgumentException, SecurityException, IllegalAccessException, NoSuchFieldException {
  for(Field field:this.getClass().getFields()) {
    if (field.isAnnotationPresent(Header.class)) {
            Header annotation = field.getAnnotation(Header.class); 

            String name = annotation.value(); 
            if(name.equals(headerValue)) {
            Object val = this.getClass().getField(name).get(this);
            return (String) val;
            }
            }
    }    
    return null;
}

有一些例外要处理:

Object val = this.getClass()。getField(name).get(this);

如果您不想从该方法中抛出该异常,则可以为该异常返回null。

答案 2 :(得分:0)

This may help you


     Field f[]= Parser.class.getDeclaredFields();
     for (int i = 0; i < f.length; i++) {

     Annotation annotation[]= f[i].getAnnotations();
     for (int j=0;j<annotation.length;j++){

     Class<Annotation> type = (Class<Annotation>) annotation[j].annotationType();               

        for (Method method : type.getDeclaredMethods()) {

            if(method.getName() .equals(headerValue))
            {
            String name=f[i].getName();
           return name;
            }
        }

     }
     } 

Parser.class.getDeclaredFields()也将包含私有字段。