7

如何获取注释中设置的值?

我定义了以下注释:

@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().

4

5 回答 5

17
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.

您还可以考虑使用enumfor this 而不是一些整数标志,例如:

public enum JsonType {
    GETTER, SETTER, OTHER;
}

public @interface JsonElement {
    JsonType type() default JsonType.OTHER;
}
于 2012-05-21T09:55:06.817 回答
3

您可以检查注释是否属于 JSonElement 如果是,您可以强制转换并调用您的方法

如果循环遍历所有注释,则

for(Annotation annotation : methods[i].getAnnotations()) {
    if(annotation instanceOf(JsonElement)){
       ((JsonElement)annotation).getType();
    }
}

或者

JSonElement jSonElement = methods[i].getAnnotations(JSonElement.class);
jSonElement.getType();
于 2012-05-21T09:51:28.830 回答
2
JsonElement jsonElement = methods[i].getAnnotation(JsonElement.class);

int type = jsonElement.type();
于 2012-05-21T09:55:00.233 回答
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;
    }
于 2012-05-21T10:06:16.840 回答
0

据我了解,您的代码会: - 遍历声明的方法 - 检查当前方法是否用 JsonElement.class 注释,它的名称以 GET_CHAR_SEQUENCE 开头,并且注释类型的值等于 GETTER_METHOD。- 你根据条件构建你的 json

我看不到您正在更改注释本身的类型成员的当前值。好像你不再需要它了。

但是有谁知道如何解决这个任务?

于 2013-06-13T10:15:45.867 回答