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

enumたとえば、整数フラグの代わりにを使用することも検討できます。

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 に答える