Java的反射机制 homework to blog4一、什么是 Java 反射反射是 Java 在运行时动态获取任意类的完整结构信息、动态创建对象、调用方法、修改成员变量的技术。正常编码是通过 new 关键字正向创建对象反射是通过 Class 对象反向解析并操作类的信息是 Java 动态编程的核心技术。一句话总结编译期间不确定要操作的类运行时才能获取类的全部信息并执行操作。二、反射的核心Class 类对象JVM 加载一个类之后会在内存中创建唯一的 Class 对象这个对象保存了类的所有元数据包括构造方法、成员变量、成员方法、注解等所有反射操作都必须基于 Class 对象完成。获取 Class 对象的三种常用方式public class GetClassObject { public static void main(String[] args) throws ClassNotFoundException { // 方式1类名.class编译期即可获取 Class? clazz1 Person.class; // 方式2对象.getClass()适用于已经创建了实例的场景 Person person new Person(); Class? clazz2 person.getClass(); // 方式3Class.forName(全类名)最常用运行时动态加载框架底层首选 Class? clazz3 Class.forName(com.demo.Person); } }三、反射核心操作相关类反射的功能都在 java.lang.reflect 包下核心类包括Constructor用于获取和调用类的构造方法创建对象Field用于获取和修改类的成员变量Method用于获取和执行类的成员方法Modifier用于解析方法、变量的修饰符比如 public、private、static 等四、完整反射示例代码第一步定义测试用的实体类public class Person { // 私有成员变量 private String name; // 公共成员变量 public int age; // 无参构造方法 public Person() { } // 有参构造方法 public Person(String name) { this.name name; } // 私有成员方法 private void sayHello(String msg) { System.out.println(msg name); } // 公共成员方法 public void showAge() { System.out.println(年龄 age); } }第二步反射实操代码可直接运行import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class ReflectDemo { public static void main(String[] args) throws Exception { // 1. 获取Person类的Class对象 ClassPerson clazz Person.class; // 2. 通过无参构造方法创建对象 ConstructorPerson constructor clazz.getDeclaredConstructor(); Person person constructor.newInstance(); System.out.println(反射创建对象成功); // 3. 反射修改私有成员变量 name Field nameField clazz.getDeclaredField(name); // 开启权限访问突破private限制 nameField.setAccessible(true); nameField.set(person, 李四); // 获取变量值并打印 System.out.println(修改后的name nameField.get(person)); // 4. 反射修改公共成员变量 age Field ageField clazz.getDeclaredField(age); ageField.set(person, 20); System.out.println(修改后的age ageField.get(person)); // 5. 反射调用公共方法 Method showMethod clazz.getDeclaredMethod(showAge); showMethod.invoke(person); // 6. 反射调用私有方法 Method helloMethod clazz.getDeclaredMethod(sayHello, String.class); helloMethod.setAccessible(true); helloMethod.invoke(person, 你好我是); } }五、反射的核心说明setAccessible (true)这个方法的作用是关闭 Java 的权限检查让反射可以访问 private 修饰的变量和方法会打破面向对象的封装特性。所有反射操作都需要处理异常常用的异常包括 ClassNotFoundException、NoSuchMethodException、IllegalAccessException 等。六、反射的应用场景框架底层实现Spring 通过反射根据配置创建 Bean 对象MyBatis 通过反射实现数据库结果集与实体类的映射配置化开发读取配置文件中的类全路径动态加载类无需修改代码工具类开发JSON 解析、对象序列化等工具都是通过反射遍历对象属性单元测试测试框架通过反射调用测试方法七、反射的优缺点优点灵活性极高运行时动态加载和操作类实现代码解耦是框架开发的基础缺点性能较低因为反射会跳过编译期优化破坏封装访问私有成员代码可读性差编译期无法检查错误八、总结反射的入口是 Class 对象有三种获取方式反射可以操作私有构造、私有变量、私有方法核心是 setAccessible (true)示例代码包含了创建对象、修改变量、调用方法的完整流程反射是 Java 框架的核心技术日常开发很少手写但必须理解原理