我看过很多与我的以下查询相关的帖子,但无法找到确切的处理方法: 我的课程如下:
public class MyClass<T> implements IMyInterface<String, T> {
@Override
public T myMethod(String jsonString) {
ObjectMapper mapper = new ObjectMapper();
//T result = mapper.readValue(jsonString, T.class) //for sure T.class does not make sense, but what is the alternative ?
}
}
我想将此类用作任何客户端的util类,该客户端可以将其json字符串传递给myMethod
并获取所需的Java对象,该对象映射到他们在实例化MyClass
时提到的类。
举个例子,一个客户端代码
MyClass<MyType1> o1 = new MyClass<MyType1>();
MyType1 myType1 = o1.myMethod(aJsonString);
获取MyType1
和另一个代码
MyClass<MyType2> o2 = new MyClass<MyType2>();
MyType2 myType2 = o2.myMethod(anotherJsonString);
获取MyType2
我看到许多与TypeReference和JavaType使用相关的帖子,但是无法确切知道如何使其适合我的上述用例。
我的主要目标是MyClass
实际上应该充当一个util类,而不知道在编译时它将输入json字符串转换为什么Java对象。它应该仅在运行时决定。
任何帮助都将受到高度赞赏!
非常感谢和最诚挚的问候
答案 0 :(得分:0)
以下解决方案适合您。有一个类型为Class的私有实例,并在构造函数中初始化它。
import org.codehaus.jackson.map.ObjectMapper;
public class MyClass<T> implements IMyInterface<String, T> {
private Class<T> clazz;
public MyClass(Class<T> clazz) {
this.clazz = clazz;
}
@Override
public T myMethod(String jsonString) throws Exception {
ObjectMapper mapper = new ObjectMapper();
T result = mapper.readValue(jsonString, clazz);
return result;
}
}
您的客户端代码将是:
MyClass<MyType1> o1 = new MyClass<MyType1>(MyType1.class);
MyType1 myType1 = o1.myMethod(aJsonString);
第二个问题的补充答案:
在spring上下文文件中,将bean定义如下。
<bean id="simpleMyType1Class" class="com.yourpackage.MyClass">
<constructor-arg>
<!-- this can be any full path to a class -->
<value>com.yourpackage.MyType1</value>
</constructor-arg>
在Java代码中,获取其bean引用,如下所示。
MyClass<MyType> o1 = (MyClass)context.getBean("simpleMyType1Class");