1️⃣ 反射是什么?简单理解:反射就是 在程序运行时“窥探”和操作类的能力”换句话说:你写好了一个类,但运行时不知道具体类长啥样?你想动态创建对象、调用方法、修改属性?这就需要 反射通俗比喻:
反射就像你拿着放大镜去看一个盒子(类)里有什么东西(属性、方法),还可以偷偷改里面的东西。
2️⃣ 反射能干啥?功能
举例
获取类信息
类名、包名、父类、接口
获取成员信息
属性、方法、构造器
动态创建对象
不用 new,运行时生成对象
调用方法
动态调用某个方法
操作属性
读写私有属性
3️⃣ 反射入门用法3.1 获取 Class 对象Class<?> clazz1 = Class.forName("com.example.User"); // 通过全类名
Class<User> clazz2 = User.class; // 通过类名
User user = new User();
Class<? extends User> clazz3 = user.getClass(); // 通过对象
Class 就是类的运行时“元信息”3.2 创建对象User user = clazz1.getDeclaredConstructor().newInstance();
动态生成对象,不用写 new User()如果构造器有参数:Constructor<User> constructor = clazz1.getDeclaredConstructor(String.class, int.class);
User user = constructor.newInstance("Alice", 20);
3.3 获取和修改属性Field field = clazz1.getDeclaredField("name"); // 私有属性也可以
field.setAccessible(true); // 打开私有权限
field.set(user, "Bob"); // 修改属性
String name = (String) field.get(user); // 获取属性
3.4 调用方法Method method = clazz1.getDeclaredMethod("sayHello", String.class);
method.setAccessible(true); // 私有方法也能调用
method.invoke(user, "World"); // 调用方法
3.5 获取类结构信息System.out.println("类名:" + clazz1.getName());
for (Field f : clazz1.getDeclaredFields()) {
System.out.println("属性:" + f.getName());
}
for (Method m : clazz1.getDeclaredMethods()) {
System.out.println("方法:" + m.getName());
}
4️⃣ 反射原理大白话解释Class 对象每个类在运行时都会对应一个 Class 对象JVM 内部用它保存类的信息(方法、字段、父类等)动态调用通过 Method.invoke(),JVM 找到方法内存地址并执行就像游戏里动态点击按钮而不是直接编写代码私有访问setAccessible(true) 直接修改 JVM 的访问检查有点像越过门卫,直接打开房间里的东西反射 vs 普通代码普通代码:编译期就确定了类和方法反射:运行期才知道类和方法优势:灵活、动态劣势:性能慢、容易破坏封装5️⃣ 注意事项性能问题反射比普通调用慢 2~5 倍不适合高频调用场景安全问题私有权限可以被打开,要注意安全边界泛型类型信息会擦除反射拿到的只是 List,具体类型 List
反射就是“在运行时偷看并操作类的内部结构”,让你可以写更灵活、更通用的程序,但也要小心别用多了拖慢性能或者破坏封装。
https://www.52runoob.com/archives/6411