簡體   English   中英

如何確定字段的未刪除類型?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM