Java 获取泛型参数的泛型超类
但是如何获得ptype的泛型超类(这不仅意味着Java 获取泛型参数的泛型超类,java,reflection,Java,Reflection,但是如何获得ptype的泛型超类(这不仅意味着Super.class,还意味着类型参数Integer) 我的用例是,我想使用反射来确定方法的参数之一是否是MyClass对象的集合(我没有要检查的实际参数实例)类型参数在编译期间在java中被擦除。看或看。所以你可能无法做到这一点 据我所知,你不能这样做 您可以使用getActualTypeArguments(),提取子项(字符串和整数)的类型参数,但不能将它们与Super中的T相关联 您还可以从类Child extends Super中提取T,但
Super.class
,还意味着类型参数Integer
)
我的用例是,我想使用反射来确定方法的参数之一是否是MyClass对象的集合(我没有要检查的实际参数实例)类型参数在编译期间在java中被擦除。看或看。所以你可能无法做到这一点 据我所知,你不能这样做 您可以使用
getActualTypeArguments()
,提取子项(字符串
和整数
)的类型参数,但不能将它们与Super
中的T
相关联
您还可以从类Child extends Super
中提取T
,但这不是您的情况
这意味着,如果您想在参数中查找集合
,您只能在使用方法(集合)
的情况下进行查找,而不能使用方法(ArrayList)
或其他方法。好吧,从上面的示例中可以进行查找。因为您可以提取方法参数(子级)的第二个类型参数(整数)的实际类型
返回true
您能进一步澄清一下您的问题吗。如果List扩展了集合,并且一个参数是泛型类型List(即getRawType返回List.class和getActualTypeArguments返回[String.class]),那么JVM在概念上就知道该参数也是集合。这是反射信息的问题,而不是类型擦除(要知道List的第一个泛型参数也是Collection的第一个泛型参数)。但我想没有
class Super<T> {}
class Child<A, B> extends Super<B> {}
class Code {
public void method(Child<String, Integer> child) {}
}
ParameterizedType ptype = (ParameterizedType) Code.class.getMethod("method").getGenericParameterTypes()[0]
Method method = Code.class.getMethod("method", Child.class);
ParameterizedType parameterType = (ParameterizedType) method.getGenericParameterTypes()[0];
Type secondType = parameterType.getActualTypeArguments()[1];
System.out.println(secondType == Integer.class);