저는 리플렉션 프록시를 사용하여 공용 API에 대한 추가 검사를 수행하고 있습니다. 본질적으로 나는 호출자가 자신의 손을 잡는 모든 객체가 실제 객체의 프록시가되도록 모든 객체를 다시 감싸고 싶습니다.ParametrizedType/TypeVariable을 클래스의 ParametrizedType을 알고있을 때 어떻게 해결할 수 있습니까?
자바는 여전히 전체 지우기 문제가 있으므로 래핑 된 객체의 유형을 전달합니다. 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를 둘러 보았다하고 delegateType
및 returnType
이를 계산하기에 충분한 정보이어야한다하더라도, resultType
을 얻을 수있는 방법을 찾을 수 없습니다.
이렇게하는 "적절한"방법은 무엇입니까?
"resultType"과 "returnType"의 차이점은 무엇입니까? – jtahlborn
resultType은 결과의 실제 유형입니다. returnType은 메소드 서명에 의해 선언 된 리턴 유형입니다. 예 : delegateType가 List이고 메서드가 get 메서드 인 경우 returnType은 E이지만 resultType은 Cat이됩니다. –
Trejkaz