# Java教程 - 4 反射
Java中的反射(Reflection)是 Java 语言的一个强大特性,它允许程序在运行的时候,检查类、接口、字段和方法的信息,并可以 动态 地创建和操作对象。
在 Java 虚拟机 JVM 加载类之后,会在 JVM 的方法区生成一个 Class 类型的对象(一个类只有一个 Class 对象),这个对象中包含了类的完整信息,包括属性和方法等。以前创建对象是通过类结构创建对象,现在是通过 Class 对象获取类的结构,所以叫反射。
通过反射可以实现的主要功能:
- 动态地创建和加载类:通过反射,可以在运行时加载并初始化类,而无需事先知道类名。
- 获取类的详细信息:可以获取类的名称、修饰符、超类、实现的接口、注解等。
- 获取类的成员信息:可以获取类的字段、方法、构造器等成员的信息。
- 动态调用方法:可以动态地调用对象的方法,即使这些方法在编译时是未知的。
# 4.1 反射初体验
首先先看一下以前,或者说是正常情况下如何创建对象,访问类中的属性以及方法。
首先创建一个 Java 类,在类中有公有和私有的构造方法、属性、方法。
class Student {
private String name;
public int age;
private Student(String name) {
this.name = name;
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
private void study() {
System.out.println("我爱学习");
}
public void sayHello(String target) {
System.out.println("Hello " + target);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
然后创建一个测试类,测试一下:
public class ReflectTest {
public static void main(String[] args) {
Student stu = new Student("doubi", 12);
System.out.println(stu.age);
stu.sayHello("zhangsan");
// Student stu2 = new Student("doubi"); // 无法调用私有构造方法
// System.out.println(stu2.name); // 无法访问私有属性
// stu2.study(); // 无法调用私有方法
}
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
正常情况下,我们只能调用非私有的构造方法、属性和方法。这就是封装的作用。
下面来使用反射来实现上面的功能:
内容未完......
← 03-注解 05-Java7新特性 →