我正在尝试创建一个接受任何类型的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 对象的测试方法
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,带有getter和setter。目前这一行:Method methods[] = T.class.getDeclaredMethods();
不起作用,因为你不能使用通用T来获取DeclaredMethods
。有没有办法这样做?还是我必须为我制作的每个 POJO 创建此实用方法?
我知道它可以使用以下方法工作:Method methods[] = User.class.getDeclaredMethods();
但这仅适用于 User 类。我正在尝试创建一个实用程序 JSON 类,该类可以接受任何 POJO 对象并尝试自动创建JSONObject
。
您正在尝试获取将返回类本身的类。
您已经手头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()