リフレクションプロキシを使用して、パブリックAPIで追加のチェックを実行しています。基本的に、呼び出し元が手に入れるオブジェクトが実際のオブジェクトのプロキシになるように、そこから戻ってくるすべてのオブジェクトをラップしたいと思います。
Javaにはまだ全体の消去の問題があるので、ラップされたオブジェクトのタイプを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
これを行うための「適切な」方法は何ですか?