我正在使用反射代理对公共 API 执行额外的检查。本质上,我想包装从它返回的每个对象,以便调用者获得的任何对象都是真实对象的代理。
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);
}
}
我环顾了 Type / ParametrizedType API,似乎无法找到一种方法来获取resultType
,即使delegateType
并且returnType
应该有足够的信息来计算它。
这样做的“正确”方法是什么?