原理
- 通过类对象的genericSuperclass与getGenericInterfaces获取父类或接口类型。
- 强转为参数化类型ParameterizedType,即带有类型参数的类型,入List,List
- 通过ParameterizedType的getActualTypeArguments方法获取参数化类型的所有类型变量
代码
构造需要的类
public class SampleTest {
interface A<T>{
}
interface B<T,E>{
}
class C<T>{
}
class D <T,E>{
}
class E implements B<A,C>{
}
class F extends D<A,C>{
}
}
获取接口类型和类型变量
@Test
public void testInterface(){
E e = new E();
Type[] genericInterfaces = e.getClass().getGenericInterfaces();
for (Type genericInterface : genericInterfaces) {
System.out.println("---"+genericInterface.getTypeName());
if (ParameterizedType.class.isAssignableFrom(genericInterface.getClass())){
ParameterizedType parameterizedType = (ParameterizedType) genericInterface;
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
for (Type actualTypeArgument : actualTypeArguments) {
System.out.println(actualTypeArgument.getTypeName());
}
}
}
}
输出:
---com.github.felix.poetrycrawl.SampleTest$B<com.github.felix.poetrycrawl.SampleTest$A, com.github.felix.poetrycrawl.SampleTest$C>
com.github.felix.poetrycrawl.SampleTest$A
com.github.felix.poetrycrawl.SampleTest$C
获取父类类型和类型变量
@Test
public void test(){
F f = new F();
Type genericSuperclass = f.getClass().getGenericSuperclass();
System.out.println("---"+genericSuperclass.getTypeName());
if (ParameterizedType.class.isAssignableFrom(genericSuperclass.getClass())) {
ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass;
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
for (Type actualTypeArgument : actualTypeArguments) {
System.out.println(actualTypeArgument.getTypeName());
}
}
}
输出
---com.github.felix.poetrycrawl.SampleTest$D<com.github.felix.poetrycrawl.SampleTest$A, com.github.felix.poetrycrawl.SampleTest$C>
com.github.felix.poetrycrawl.SampleTest$A
com.github.felix.poetrycrawl.SampleTest$C