# Java教程 - 4 反射

Java中的反射(Reflection)是 Java 语言的一个强大特性,它允许程序在运行的时候,检查类、接口、字段和方法的信息,并可以 动态 地创建和操作对象。

在 Java 虚拟机 JVM 加载类之后,会在 JVM 的方法区生成一个 Class 类型的对象(一个类只有一个 Class 对象),这个对象中包含了类的完整信息,包括属性和方法等。以前创建对象是通过类结构创建对象,现在是通过 Class 对象获取类的结构,所以叫反射。

通过反射可以实现的主要功能:

  1. 动态地创建和加载类:通过反射,可以在运行时加载并初始化类,而无需事先知道类名。
  2. 获取类的详细信息:可以获取类的名称、修饰符、超类、实现的接口、注解等。
  3. 获取类的成员信息:可以获取类的字段、方法、构造器等成员的信息。
  4. 动态调用方法:可以动态地调用对象的方法,即使这些方法在编译时是未知的。

# 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

然后创建一个测试类,测试一下:

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

正常情况下,我们只能调用非私有的构造方法、属性和方法。这就是封装的作用。


下面来使用反射来实现上面的功能:

内容未完......