0%

java | 反射操作泛型

Java 采用泛型擦除机制引入泛型,Java 中的泛型仅仅是给编译器 javac 使用的,确保数据的安全性和免去强制类型转换问题,但是,一旦编译完成,所有和泛型有关的类型全部擦除。

为了通过反射操作这些类型,Java 新增了

  • ParameterizedType
  • GenericArrayType
  • TypeVariable
  • WildcardType

集中类型代表不能被归一到 Class 类中的类型但是又和原始类型齐名的类型。

  • ParamterizedType
    • 表示一种参数化类型,比如 Collection<String>
  • GenericArrayType
    • 表示一种元素类型是参数化类型或类型变量的数组类型
  • TypeVariable
    • 是各种类型变量的公共父接口
  • WildcardType
    • 代表一种通配符类型表达式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package com.redisc;

import java.lang.reflect.*;
import java.util.List;
import java.util.Map;


public class Test {

public void test1(Map<String, Integer> map, List<Integer> list) {

}

public Map<String, Integer> test2() {
return null;
}

public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Method method = Test.class.getMethod("test1", Map.class, List.class);

Type[] types = method.getGenericParameterTypes(); // 获取范型的参数类型
for (Type type : types) {
if (type instanceof ParameterizedType) { // 是不是参数化类型
Type[] arguments = ((ParameterizedType) type).getActualTypeArguments();
for (Type type1 : arguments) {
System.out.println(type1);
}
}
}
/**
* 输出
*
* class java.lang.String
* class java.lang.Integer
* class java.lang.Integer
* */

Method method2 = Test.class.getMethod("test2", null);
Type type2 = method2.getGenericReturnType(); // 获取范型的返回值类型
if (type2 instanceof ParameterizedType) { // 是不是参数化类型
Type[] arguments = ((ParameterizedType) type2).getActualTypeArguments();
for (Type type1 : arguments) {
System.out.println(type1);
}
}
/**
* 输出
*
* class java.lang.String
* class java.lang.Integer
* */
}
}
请我喝杯咖啡吧~