如何确定字段的未删除类型?

Dav*_*rry 5 java reflection

我有一个通用的响应包装类:

public class Response <T> {
    T response;
}
Run Code Online (Sandbox Code Playgroud)

和不相关的类包装:

public class ServiceResponse {
    String someField;
}
Run Code Online (Sandbox Code Playgroud)

当我发出服务请求时,我得到的JSON响应类似于:

{ "code":200, "response":{"someField":"some text"} }
Run Code Online (Sandbox Code Playgroud)

现在,我所有的服务响应都有相同的外包装,即它们都有:

{ "code":200, "timestamp":"....", "response":... }
Run Code Online (Sandbox Code Playgroud)

但是响应字段的实际格式/类型对于每个服务请求是不同的.当我反序列化响应时,我需要知道response字段的类型,以便我可以创建适当的实例,如果反序列化在内部完成Response,我可以使用:

response = new T(jsonParser);
Run Code Online (Sandbox Code Playgroud)

但是,我在一个由反射驱动的库中执行所有这些操作,因此我通常使用以下代码反序列化整个树:

wrapper = deserializer.parseObject(Response<ServiceResponse>.class)
Run Code Online (Sandbox Code Playgroud)

但是,此时我的parseObject方法无法正确确定T的类型.

我可以使用类似的东西:

Response<ServiceResponse> response = new Response<>();
Field field = response.getClass().getDeclaredField("response");
Type type = field.getGenericType();
Run Code Online (Sandbox Code Playgroud)

然后告诉我这response是类型T但我真正需要的是ServiceResponse

根据这个SO问题,我尝试进行转换,ParameterizedType但实际上它似乎适用于类型的字段Response<ServiceResponse>而不是实际的字段(并且因为type无法转换而失败ParameterizedType)

有没有办法确定(在运行时)原始类型response

最后,我可能最终需要创建一个注释,提供有关如何反序列化字段的更多详细信息,可能通过提供执行此功能的功能,但更喜欢更透明的方法.

另一种可能性是在初始化时将实际的T实例分配给响应然后我可以从中获取实际类型...

Gil*_*lad -1

查看这篇文章: http://mydailyjava.blogspot.com/2013/06/advanced-java-generics-retreiving.html

它实际上正是正在寻找的东西。

据此,您只需要扩展您的Response类,然后查询其超级的泛型类型。