0%

Java 反射获取类所实现接口的泛型实际值

1.有三个类

TestClass (Main 方法所在类)
TempClass (测试用的类)
TempClass$InnerClass (测试用 TempClass 的内部类)

2.三个类的代码如下

1
2
3
4
5
6
public class TestClass {

public static void main(String[] args) {
// TODO:实现过程一会在这儿写
}
}
1
2
3
4
5
6
7
8
9
10
11
public class TempClass {

// 随便找了个需要泛型的接口实现了2333
class InnerClass implements Comparable<String> {

@Override
public int compareTo(String o) {
return 0;
}
}
}

3.实现过程
首先,获取 TempClass 的内部类 InnerClass

1
2
Class<?>[] classes = TempClass.class.getDeclaringClass();
Class<?> innerClass = classes[0];

API 简介(Class):

getClasses() :获取该类的 public 内部类
getDeclaredClasses() :获取该类的所有内部类

然后,获取这个内部类所实现的接口

1
2
Type[] types = innerClass.getGenericInterfaces();
ParameterizedType type = (ParameterizedType) types[0];

API 简介(Class):

getGenericSuperclass() :获取该类 Type 类型的父类
getGenericInterfaces() :获取该类所实现的 Type 类型的接口数组

之后,强转为 ParameterizedType 类型,调用其中的 getActualTypeArguments() 方法,该方法也是返回一个 Type 类型的数组,分别存储的是具体的运行时泛型类型。这里取第一个,强转为 Class 就是实际的值了。

最后,全部代码放上

1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String[] args) {
// TODO:实现过程一会在这儿写

Class<?>[] classes = TempClass.class.getDeclaredClasses();
Class<?> innerClass = classes[0];

Type[] types = innerClass.getGenericInterfaces();
ParameterizedType type = (ParameterizedType) types[0];

Class<?> clazz = (Class<?>) type.getActualTypeArguments()[0];

System.out.println(clazz);
}

运行结果
snipaste20170328_180648.png