0

あらゆるタイプのPOJOを受け入れ、そのPOJOをJSONオブジェクトに変換するユーティリティクラスを作成しようとしています。Javaリフレクションとアノテーションを使用して、特定のgetterメソッドを調べ、それに基づいてキーと値のJSON要素を作成する必要があります。

これを行うためにジェネリックを使用しようとしていますが、機能していないようです。これは不可能ですか?

クラスオブジェクトをパラメータとして渡し、可能であれば正しいクラスメソッドを取得したいと思います。

私がこれまでに書いたコード:

package com.jr.freedom.util;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import net.sf.json.JSONObject;

public class JsonParserUtil {
    private static final String GET_CHAR_SEQUENCE = "get";

    public static <T> JSONObject toJsonObject(Class<T> classObject) {
        // get Method names with @JsonElement included
        Method methods[] = classObject.class.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.contains(GET_CHAR_SEQUENCE)) {
                    key.replaceFirst(GET_CHAR_SEQUENCE, "");
                    jsonObject.put(key, methods[i].invoke(classObject));
                }
            }
            return jsonObject;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

上記のJSONutilオブジェクトを使用しようとするtestMethodは次のとおりです

User user = new User();
user.setBio("bio mate");
user.setCountry("uk");
user.setEmailAddress("jonney@ooglemail.com");
user.setFirstName("jono");
user.setPassword("passwordfdsadsa");
user.setUsername("crazy8");
JSONObject jsonUser =  new JsonParserUtil<User>().toJsonObject(user);

ユーザークラスは、ゲッターとセッターを備えた単純なPOJOです。現在、この行Method methods[] = T.class.getDeclaredMethods();は機能しません。一般的なTを使用してを取得することはできないためDeclaredMethodsです。そうする方法はありますか?または、作成するすべてのPOJOに対してこのutilメソッドを作成する必要がありますか?

私はそれがを使用して動作することを知っています:Method methods[] = User.class.getDeclaredMethods();しかし、それはUserクラスにのみ適用されます。任意のPOJOオブジェクトを取得して自動的に作成できるutilJSONクラスを作成しようとしていJSONObjectます。

4

2 に答える 2

0

クラス自体を返すクラスのクラスを取得しようとしています。

すでにClass<T> classObjectUserクラスが手元にあるので、機能するclassObject.getDeclaredMethods()はずですが、シリアル化するオブジェクトが必要です。または、シリアル化するUserオブジェクトを渡して、オブジェクトからクラスタイプを取得し、シリアル化することもできます。

于 2012-05-18T10:41:28.377 に答える
0

解決:

public static JSONObject toJsonObject(Object classObject) {
        // get Method names with @JsonElement included

        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)) {
                    key = key.replaceFirst(GET_CHAR_SEQUENCE, "");
                    jsonObject.put(key, methods[i].invoke(classObject));
                }

            }
            return jsonObject;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

    }

使用する鍵

classObject.getClass()
于 2012-05-18T11:13:51.527 に答える