Java反射是一个强大的特性,它允许我们在运行时访问和修改类的信息,包括类名、方法名、参数类型等,并且可以动态地创建对象和调用方法。下面通过一个简单的例子来说明反射的使用:
示例目标
假设我们有一个简单的Person类,它有两个属性:name和age,以及对应的getter和setter方法。我们的目标是通过反射来创建Person类的实例,并调用其setter方法设置属性值。
Person类定义

package com.wzdyt.myrpcspringbootstarter.a;

public class Person {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

使用反射操作Person类
接下来,我们通过反射来创建Person类的实例,并设置其属性值。

package com.wzdyt.myrpcspringbootstarter.a;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectionExample {
    public static void main(String[] args) {
        try {
            // 获取Person类的Class对象
            Class<?> personClass = Class.forName(Person.class.getName());

            // 使用无参构造器创建Person类的实例
            Object personInstance = personClass.getDeclaredConstructor().newInstance();

            // 获取setName方法
            Method setNameMethod = personClass.getMethod("setName", String.class);
            // 调用 = setName方法设置name属性
            setNameMethod.invoke(personInstance, "Alice");

            // 获取setAge方法
            Method setAgeMethod = personClass.getMethod("setAge", int.class);
            // 调用setAge方法设置age属性
            setAgeMethod.invoke(personInstance, 30);


            Method getNameMethod = personClass.getMethod("getName");   // 获取getName方法并调用;
            System.out.println("Name: " + getNameMethod.invoke(personInstance));

            // 获取getAge方法并调用
            Method getAgeMethod = personClass.getMethod("getAge");
            System.out.println("Age: " + getAgeMethod.invoke(personInstance));

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

解释

  • 获取Class对象:通过Class.forName()方法根据类的全限定名获取其Class对象。
  • 创建实例:使用getDeclaredConstructor().newInstance()调用无参构造函数创建类的实例。
  • 获取并调用方法:利用getMethod()获取指定的方法(通过方法名和参数类型),然后使用invoke()方法在对象上执行该方法。
  • 输出结果:最后,我们通过反射调用getter方法输出设置后的属性值。

这个例子展示了反射的基本用法,包括动态创建对象、调用方法和访问属性,体现了反射的灵活性和强大功能。