我正在使用反射代理在公共API上執行其他檢查。基本上我想包裝從它回來的每個對象,以便調用者獲得它們的任何對象都是真實對象的代理。當我知道它所在的類的ParametrizedType時,如何解析ParametrizedType/TypeVariable?
Java仍然有整個擦除問題,所以我傳遞包裝對象的類型。我應該知道一切是什麼類型,因爲進入API是一個單一的非泛型接口。
public class ProxyInvocationHandler implements InvocationHandler {
private final Object delegate;
private final Type delegateType;
public ProxyInvocationHandler(Object delegate, Type delegateType) {
this.delegate = delegate;
this.delegateType = delegateType;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) {
// Omitted: additional checks performed here.
Object result = method.invoke(delegate, args);
Type returnType = method.getGenericReturnType();
// e.g. if delegateType is List<Cat> and the method is the get method,
// returnType would be E but resultType should be Cat.
Type resultType = ???
// Utility method I will omit, it just creates another proxy instance
// using its own invocation handler.
return ProxyUtils.wrap(result, resultType);
}
}
我環顧四周類型/ ParametrizedType API似乎並不能找到一個辦法讓resultType
,即使delegateType
和returnType
應該是足夠的信息來計算此。
什麼是「正確」的方式來做到這一點?
「resultType」和「returnType」之間的區別是什麼? – jtahlborn
resultType是結果的實際類型。 returnType是由方法簽名聲明的返回類型。例如如果delegateType是List且方法是get方法,則returnType將爲E,但resultType爲Cat。 –
Trejkaz