java getgenericparametertypes,如何从Java 8中的getAnnotatedParameterTypes()获取泛型类型信息?...
It seems like getAnnotatedParameterTypes() returns an array of AnnotatedTypes holding raw, rather than generic, types.For example:publicvoid genericMethod(T t) {}@Testpublic void testAnnotatedType...
It seems like getAnnotatedParameterTypes() returns an array of AnnotatedTypes holding raw, rather than generic, types. For example:
public void genericMethod(T t) {
}
@Test
public void testAnnotatedTypes() throws ReflectiveOperationException {
Method method = getClass().getMethod("genericMethod", Object.class);
Type type = method.getGenericParameterTypes()[0];
assertTrue(type instanceof TypeVariable);
AnnotatedType annotatedType = method.getAnnotatedParameterTypes()[0];
// This fails; annotatedType implements only AnnotatedType
assertTrue(annotatedType instanceof AnnotatedTypeVariable);
// This fails too; type is a TypeVariable while annotatedType.getType() is
// Object.class
assertEquals(type, annotatedType.getType());
}
What's the reason for the disagreement with getGenericParameterTypes()?
解决方案
There's a bug report about this, and it has since been fixed.
There's a difference between Method#getGenericParameterTypes() and Method#getAnnotatedParameterTypes().
The former makes guarantees about the types it returns
If a formal parameter type is a parameterized type, the Type object
returned for it must accurately reflect the actual type parameters
used in the source code.
If a formal parameter type is a type variable or a parameterized type,
it is created. Otherwise, it is resolved.
while the latter doesn't, not clearly at least:
Returns an array of AnnotatedType objects that represent the use of
types to specify formal parameter types of the method/constructor
represented by this Executable.
We have to assume that getAnnotatedParameterTypes() returns the erased types (although it may not have been intended that way). The unbounded type variable T is erased to Object. If you had , it would be erased to Foo.
As for the comments, about getting the annotation from a type argument in a method parameter, there's no way given the above. One would think it works as it does for fields.
public static void main(String[] args) throws Exception {
Field field = Example.class.getField("field");
AnnotatedParameterizedType annotatedParameterizedType = (AnnotatedParameterizedType) field
.getAnnotatedType();
System.out.println(annotatedParameterizedType
.getAnnotatedActualTypeArguments()[0].getType());
System.out.println(Arrays.toString(annotatedParameterizedType
.getAnnotatedActualTypeArguments()[0].getAnnotations()));
}
@Retention(RetentionPolicy.RUNTIME)
@Target(value = { ElementType.TYPE_USE })
@interface Bar {
}
public List field;
which prints
class java.lang.String
[@com.example.Example$Bar()]
I very much think it's a bug that needs fixing and will be following the bug report linked above.
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)