首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >大白话说Java反射:入门、使用、原理

大白话说Java反射:入门、使用、原理

原创
作者头像
用户3672714
发布2025-08-31 09:07:08
发布2025-08-31 09:07:08
3140
举报

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️⃣ 反射原理大白话解释

  1. Class 对象
    • 每个类在运行时都会对应一个 Class 对象
    • JVM 内部用它保存类的信息(方法、字段、父类等)
  2. 动态调用
    • 通过 Method.invoke(),JVM 找到方法内存地址并执行
    • 就像游戏里动态点击按钮而不是直接编写代码
  3. 私有访问
    • setAccessible(true) 直接修改 JVM 的访问检查
    • 有点像越过门卫,直接打开房间里的东西
  4. 反射 vs 普通代码
    • 普通代码:编译期就确定了类和方法
    • 反射:运行期才知道类和方法
    • 优势:灵活、动态
    • 劣势:性能慢、容易破坏封装

5️⃣ 注意事项

  1. 性能问题
    • 反射比普通调用慢 2~5 倍
    • 不适合高频调用场景
  2. 安全问题
    • 私有权限可以被打开,要注意安全边界
  3. 泛型类型信息会擦除
    • 反射拿到的只是 List,具体类型 List<String> 不可直接获取

6️⃣ 小结

  • 反射是万能钥匙:可以动态操作类、对象、方法、属性
  • 优点:灵活、可扩展、支持框架(Spring、MyBatis、JUnit 都用反射)
  • 缺点:性能慢、破坏封装、使用不当容易报错

一句话大白话总结

反射就是“在运行时偷看并操作类的内部结构”,让你可以写更灵活、更通用的程序,但也要小心别用多了拖慢性能或者破坏封装。

https://www.52runoob.com/archives/6411

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 1️⃣ 反射是什么?
  • 2️⃣ 反射能干啥?
  • 3️⃣ 反射入门用法
    • 3.1 获取 Class 对象
    • 3.2 创建对象
    • 3.3 获取和修改属性
    • 3.4 调用方法
    • 3.5 获取类结构信息
  • 4️⃣ 反射原理大白话解释
  • 5️⃣ 注意事项
  • 6️⃣ 小结
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档