01. Java反射API

a large group of rocks in the middle of a desert

java.lang.Class类

Class 类的一个实例表示 Java 的一种数据类型,包括类、接口、枚举、注解(Annotation)、数组、基本数据类型和 void。Class 没有公有的构造方法,Class 实例是由 JVM 在类加载时自动创建的。

在程序代码中获得 Class 实例可以通过如下代码实现:

1
2
3
4
5
// 1. 通过类型class静态变量
Class clz1 = String.class;
String str = "Hello";
// 2. 通过对象的getClass()方法
Class clz2 = str.getClass();

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void main(String[] args) {
Class<String> clz1 = String.class;
String str = "chenym";
Class<? extends String> clz2 = str.getClass();
Class<Integer> clz3 = int.class;
Class<Integer> clz4 = Integer.class;
System.out.println("clz2类名称:" + clz2.getName());
System.out.println("clz2是否为接口:" + clz2.isInterface());
System.out.println("clz2是否为数组对象:" + clz2.isArray());
System.out.println("clz2父类名称:" + clz2.getSuperclass().getName());
System.out.println("clz2是否为基本类型:" + clz2.isPrimitive());
System.out.println("clz3是否为基本类型:" + clz3.isPrimitive());
System.out.println("clz4是否为基本类型:" + clz4.isPrimitive());
}

示例结果:

1
2
3
4
5
6
7
clz2类名称:java.lang.String
clz2是否为接口:false
clz2是否为数组对象:false
clz2父类名称:java.lang.Object
clz2是否为基本类型:false
clz3是否为基本类型:true
clz4是否为基本类型:false

java.lang.reflect包

该包下包含了反射使用到的类,主要有:

  • Constructor 类:提供类的构造方法信息。
  • Field 类:提供类或接口中成员变量信息。
  • Method 类:提供类或接口成员方法信息。
  • Array 类:提供了动态创建和访问 Java 数组的方法。
  • Modifier 类:提供类和成员访问修饰符信息。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public static void main(String[] args) {
try {
// 动态加载类的运行时对象
Class<?> c = Class.forName("com.example.basejava.reflect.Person");
// 获取该类包含的所有成员方法
Method[] methods = c.getDeclaredMethods();
// 遍历成员方法
for (Method method : methods) {
// 打印每个方法的访问权限
System.out.println("打印每个方法的访问权限:");
System.out.println(Modifier.toString(method.getModifiers()));
System.out.println("--------------------------------");
System.out.println("打印每个方法的返回值:");
// 打印每个方法的返回值
System.out.println(method.getReturnType().getName() + " ");
System.out.println("--------------------------------");
System.out.println("打印每个方法方法名称:");
// 打印每个方法方法名称
System.out.println(method.getName());
}
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}

11