[英]How can I determine the unerased type of a field?
我有一個通用的響應包裝類:
public class Response <T> {
T response;
}
和不相關的類包裝:
public class ServiceResponse {
String someField;
}
當我發出服務請求時,我得到的JSON響應類似於:
{ "code":200, "response":{"someField":"some text"} }
現在,我所有的服務響應都有相同的外包裝,即它們都有:
{ "code":200, "timestamp":"....", "response":... }
但是響應字段的實際格式/類型對於每個服務請求是不同的。 當我反序列化響應時,我需要知道response
字段的類型,以便我可以創建適當的實例,如果反序列化是在Response
中完成的,我可以使用:
response = new T(jsonParser);
但是,我在一個由反射驅動的庫中執行所有這些操作,因此我通常使用以下代碼反序列化整個樹:
wrapper = deserializer.parseObject(Response<ServiceResponse>.class)
但是,此時我的parseObject方法無法正確確定T的類型。
我可以使用類似的東西:
Response<ServiceResponse> response = new Response<>();
Field field = response.getClass().getDeclaredField("response");
Type type = field.getGenericType();
然后告訴我response
是類型T
但我實際需要的是ServiceResponse
根據這個SO問題,我嘗試將其作為ParameterizedType
轉換,但實際上它似乎適用於Response<ServiceResponse>
類型的字段而不是其中的實際字段(並且因為type
無法轉換為ParameterizedType
而失敗)
有沒有辦法確定(在運行時)原始類型的response
?
最后,我可能最終需要創建一個注釋,提供有關如何反序列化字段的更多詳細信息,可能通過提供執行此功能的功能,但更喜歡更透明的方法。
另一種可能性是在初始化時將實際的T實例分配給響應然后我可以從中獲取實際類型...
看看這篇文章: http : //mydailyjava.blogspot.com/2013/06/advanced-java-generics-retreiving.html
這正是你正在尋找的。
根據這個,你只需要擴展你的Response
類,然后查詢它的超類的泛型類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.