反射常用方法
PPG007 ... 2021-12-28 About 1 min
# 反射常用方法
// 含包名
System.out.println(testClass.getName());
// 不含包名
System.out.println(testClass.getSimpleName());
// 获取类修饰符
// getModifiers返回一个int,使用Modifier类的方法可以进行判断
System.out.println(testClass.getModifiers());
System.out.println(Modifier.isPublic(testClass.getModifiers()));
// 获取包信息
System.out.println(testClass.getPackage());
// 获取父类的class对象
System.out.println(testClass.getSuperclass());
// 获取接口信息,不包含父类实现的接口
for (Class<?> anInterface : testClass.getInterfaces()) {
System.out.println(anInterface);
}
// 获取构造函数,只能获取到public修饰的构造函数。需要捕获NoSuchMethodException异常。
for (Constructor<?> constructor : testClass.getConstructors()) {
System.out.println(constructor);
}
// 通过无参构造器创建对象,没有无参构造器会报错
User user = (User) aClass.newInstance();
System.out.println(user);
// 有参构造器创建对象
Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(String.class, int.class);
Object ppg = declaredConstructor.newInstance("ppg", 123);
System.out.println(ppg);
// 通过反射调用普通方法
// 通过反射获取一个方法
// 如果调用的是static方法,invoke()方法第一个参数就用null代替:
Method getName = aClass.getDeclaredMethod("getName");
Method getId = aClass.getMethod("getId");
Object invoke = getName.invoke(ppg);
Object invoke1 = getId.invoke(ppg);
System.out.println("ppg==>"+invoke+invoke1);
// 通过反射设置属性
Field id = aClass.getDeclaredField("id");
// 设置允许修改private属性
id.setAccessible(true);
// 对象名,值
id.set(ppg,1);
System.out.println("ppg==>"+ppg);
// 泛型
public void fx(Map<String, String> map, List<Boolean> booleans) {
System.out.println("success");
}
Class<Fx> fxClass = Fx.class;
Method fx = fxClass.getMethod("fx", Map.class,List.class);
// 获得泛型的参数类型
Type[] genericParameterTypes = fx.getGenericParameterTypes();
for (Type genericParameterType : genericParameterTypes) {
System.out.println("泛型的参数类型:"+genericParameterType);
//泛型的参数类型是否等于参数化类型
if (genericParameterType instanceof ParameterizedType){
//getActualTypeArguments获得真实的参数类型信息
Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();
for (Type actualTypeArgument : actualTypeArguments) {
System.out.println(actualTypeArgument);
}
}
}
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73