繁体   English   中英

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

[英]Using generics to get class methods via reflection in Java

我正在尝试创建一个接受任何类型 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;
        }
    }
}

这是尝试使用上述 JSON util 对象的 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);

User 类是一个带有 getter 和 setter 的简单 POJO。 目前这一行: Method methods[] = T.class.getDeclaredMethods(); 不起作用,因为您不能使用通用 T 来获取DeclaredMethods 有没有办法这样做? 或者我是否必须为我制作的每个 POJO 创建这个 util 方法?

我知道它可以使用: Method methods[] = User.class.getDeclaredMethods(); 但这仅适用于 User 类。 我正在尝试创建一个 util JSON 类,该类可以采用任何 POJO 对象并尝试自动创建JSONObject

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

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

解决方案:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM