如何在注释中设置值?
我定义了以下注释:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface JsonElement {
int type();
}
以下是在POJO类中使用它的方法
@JsonElement(type=GETTER_METHOD)
public String getUsername{
........................
}
使用反射来检查此方法是否存在JSonElement注释并检查类型值是什么的util类。
Method methods[] = classObject.getClass().getDeclaredMethods();
JSONObject jsonObject = new JSONObject();
try {
for (int i = 0; i < methods.length; i++) {
String key = methods[i].getName();
System.out.println(key);
if (methods[i].isAnnotationPresent(JsonElement.class) && key.startsWith(GET_CHAR_SEQUENCE)) {
methods[i].getDeclaredAnnotations();
key = key.replaceFirst(GET_CHAR_SEQUENCE, "");
jsonObject.put(key, methods[i].invoke(classObject));
}
}
return jsonObject;
} catch (Exception e) {
e.printStackTrace();
return null;
}
如何找出type()
的值是多少?我可以找到是否存在注释,但我找不到一个方法来找出为type()
设置的值(如果有的话)。
答案 0 :(得分:16)
JsonElement jsonElem = methods[i].getAnnotation(JsonElement.class);
int itsTypeIs = jsonElem.type();
请注意,您必须确保
jsonElem
不是null
isAnnotationPresent(JsonElement.class)
或简单的
if (jsonElem != null) {
}
检查。
此外,如果您将注释更改为
public @interface JsonElement {
int type() default -1;
}
您不必在代码中type
出现@JsonElement
时声明-1
属性 - 它默认为enum
。
您也可以考虑使用public enum JsonType {
GETTER, SETTER, OTHER;
}
public @interface JsonElement {
JsonType type() default JsonType.OTHER;
}
代替一些整数标志,例如:
{{1}}
答案 1 :(得分:3)
您可以检查注释是否属于JSonElement,如果是,您可以投射并调用您的方法
如果循环遍历所有注释,则
for(Annotation annotation : methods[i].getAnnotations()) {
if(annotation instanceOf(JsonElement)){
((JsonElement)annotation).getType();
}
}
或
JSonElement jSonElement = methods[i].getAnnotations(JSonElement.class);
jSonElement.getType();
答案 2 :(得分:2)
JsonElement jsonElement = methods[i].getAnnotation(JsonElement.class);
int type = jsonElement.type();
答案 3 :(得分:0)
溶液:
Method methods[] = classObject.getClass().getDeclaredMethods();
JSONObject jsonObject = new JSONObject();
try {
for (int i = 0; i < methods.length; i++) {
String key = methods[i].getName();
System.out.println(key);
if (methods[i].isAnnotationPresent(JsonElement.class)
&& key.startsWith(GET_CHAR_SEQUENCE)
&& (methods[i].getAnnotation(JsonElement.class).type() == GETTER_METHOD)) {
key = key.replaceFirst(GET_CHAR_SEQUENCE, "");
jsonObject.put(key, methods[i].invoke(classObject));
}
}
return jsonObject;
} catch (Exception e) {
e.printStackTrace();
return null;
}
答案 4 :(得分:0)
根据我的理解,您的代码可以: - 迭代声明的方法 - 检查当前方法是否使用JsonElement.class注释,其名称以GET_CHAR_SEQUENCE开头,注释类型的值等于GETTER_METHOD。 - 根据条件构建你的json
我无法看到您正在更改注释本身的类型成员的currenty值。 好像你不再需要它了。
但有人知道如何整理这项任务吗?