我想使用以下类的方法 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 的值
我怎样才能做到这一点?或者这是编码此要求的更好方法吗?
答案 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()也将包含私有字段。