Java 学习博客:全面理解 Java 反射机制
一、什么是反射
反射(Reflection)是 Java 动态编程核心技术,允许程序在运行时获取类的完整信息、操作类的成员(构造器、属性、方法),突破编译期访问限制。
正常正向流程:new 类名() → 先知道类再创建对象;
反射逆向流程:拿到对象 / 类名字符串 → 反向解析类结构、动态创建对象、调用方法。
JVM 加载类后会生成Class对象,反射所有操作都依托该对象完成。
二、获取 Class 对象的 3 种方式
点击查看代码
// 1. 类名.class(编译期,推荐静态获取)
Class<User> clazz1 = User.class;
// 2. 对象.getClass()(已有实例时使用)
User user = new User();
Class<?> clazz2 = user.getClass();
// 3. Class.forName("全类名")(运行时动态加载,框架最常用)
Class<?> clazz3 = Class.forName("com.demo.User");
三、反射核心 API
- 构造器:动态创建对象
点击查看代码
Class<User> clazz = User.class;
// 无参构造
User u1 = clazz.newInstance();
// 有参构造
Constructor<User> con = clazz.getDeclaredConstructor(String.class,Integer.class);
con.setAccessible(true); // 暴力访问私有构造
User u2 = con.newInstance("张三",20);
点击查看代码
Field nameField = clazz.getDeclaredField("name");
nameField.setAccessible(true);
nameField.set(u2,"李四"); // 赋值
String name = (String) nameField.get(u2); // 取值
点击查看代码
Method show = clazz.getDeclaredMethod("show",String.class);
show.setAccessible(true);
show.invoke(u2,"测试反射调用");
四、暴力反射 setAccessible (true)
Java 访问修饰符(private/protected)仅在编译期生效,运行时通过setAccessible(true)关闭权限校验,可读写私有属性、调用私有方法、实例化私有构造,是反射突破封装的关键。
五、反射典型应用场景
主流框架底层:Spring IOC 通过反射实例化 Bean;MyBatis 反射封装数据库结果集到实体类。
配置文件解耦:读取 properties/yml 中的全类名字符串,动态加载类,无需编译修改代码。
通用工具封装:对象拷贝、序列化、JSON 解析、单元测试框架 JUnit。
动态代理基础:AOP 切面编程底层依赖反射 + 动态代理实现方法增强。
浙公网安备 33010602011771号