gpt4 book ai didi

java - 当我知道 ParametrizedType/TypeVariable 所在类的 ParametrizedType 时,如何解析它?

转载 作者:行者123 更新时间:2023-11-30 04:39:48 26 4
gpt4 key购买 nike

我正在使用反射代理对公共(public) API 执行额外检查。本质上,我想包装从它返回的每个对象,以便调用者得到的任何对象都是真实对象的代理。

Java 仍然存在整个删除问题,因此我用它传递包装对象的类型。我应该知道所有东西是什么类型,因为 API 的入口是一个单一的、非通用的接口(interface)。

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 的方法,尽管 delegateTypereturnType > 应该有足够的信息来计算这个。

执行此操作的“正确”方法是什么?

最佳答案

您可以使用Java ClassMate为了这个目的。您必须使用 com.fasterxml.classmate.GenericType 来作为类型标记:

GenericType<?> delegateType = new GenericType<List<Cat>>() {};

请注意名为 "Super-type Token" pattern 的空 {} .

TypeResolver typeResolver = new TypeResolver();
MemberResolver memberResolver = new MemberResolver(

ResolvedType type = typeResolver.resolve(delegateType);
ResolvedTypeWithMembers members = memberResolver.resolve(type, null, null);
ResolvedMethod[] methods = members.getMemberMethods();

将结果缓存在Map中:

Map<Method, ResolvedMethod> resolved = new HashMap<>();
for (ResolvedMethod method: methods) {
resolved.put(method.getRawMember(), method);
}

现在,当您有一个由 delegateType 声明的方法(即 List)时,您可以获得其已解析返回类型:

Method method = List.class.getMethod("get", int.class);
ResolvedType resultType = resolved.get(method).getReturnType();
System.out.println("resultType = " + resultType); // prints resultType = Cat

关于java - 当我知道 ParametrizedType/TypeVariable 所在类的 ParametrizedType 时,如何解析它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12575053/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com