使用泛型通过Java中的反射获取类方法

时间:2012-05-18 10:30:24

标签: java json reflection

我正在尝试创建一个实用程序类,它接受任何类型的POJO并使用java反射和注释将该Pojo转换为JSON对象,以查看某些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;
        }

    }

}

这里是testMethod尝试使用上面的Json util对象

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);

用户类是一个带有getter和setter的简单POJO。目前在这一行:方法方法[] = T.class.getDeclaredMethods();它不会工作,因为你不能使用通用T来获得声明的方法。有没有办法这样做?或者我是否必须为我制作的每一个POJO创建thios util方法?

我知道它可以使用:方法方法[] = User.class.getDeclaredMethods();但这只适用于User类。我基本上是在尝试创建一个可以接受任何POJO对象的util json类,并尝试自动创建一个jsonObject。

提前致谢

2 个答案:

答案 0 :(得分:0)

您正在尝试获取Class类,它将返回Class本身。

您已经拥有Class<T> classObject用户类,因此classObject.getDeclaredMethods()应该可以工作,但您仍然需要对象进行序列化,或者您可以传递User对象进行序列化,然后从对象中获取类类型然后序列化它。

答案 1 :(得分: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()