温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java反射是什么原理

发布时间:2026-09-14 01:24:24 来源:亿速云 阅读:100 作者:小樊 栏目:编程语言

Java 反射(Reflection)是 Java 在运行时动态获取类信息并操作类成员的一种机制。它的核心原理可以概括为:JVM 在加载类时,会把类的结构信息封装成 Class 对象,反射就是通过这些 Class 对象来反向操作类。

下面从原理层面分点说明:


一、Class 对象是反射的核心

1. 类加载过程

当 JVM 加载一个类(如 User.class)时:

  1. 类加载器把 .class 文件读入内存
  2. JVM 解析字节码
  3. 在方法区(或元空间)生成对应的 Class 对象

Class 对象中保存了:

  • 类名、包名、父类
  • 字段(Field)
  • 构造方法(Constructor)
  • 方法(Method)
  • 注解、修饰符等

2. 获取 Class 对象的三种方式

Class<?> c1 = User.class;
Class<?> c2 = user.getClass();
Class<?> c3 = Class.forName("com.xxx.User");

这三种方式拿到的都是同一个 Class 对象(一个类在 JVM 中只有一个 Class 对象)。


二、反射是如何“看穿”类的

反射并不是“破解”,而是 JVM 主动提供的数据接口。

例如:

Method m = clazz.getMethod("say", String.class);
m.invoke(obj, "hello");

底层流程:

  1. clazz.getMethod()
    → 从 Class 对象的方法表中查找
  2. Method.invoke()
    → 调用 JVM 内部方法(native 方法)
  3. JVM 直接执行字节码指令(如 invokevirtual)

也就是说:

反射本质 = Class 元数据 + JVM 提供的 native 调用能力


三、反射为什么能访问 private

Java 的访问控制是编译期 + JVM 运行期双重检查:

  • private 是给编译器看的
  • JVM 在运行期默认也会检查
  • 但 setAccessible(true) 会 关闭访问检查
field.setAccessible(true);
field.set(obj, value);

注意:

  • 这只是“绕过 Java 语言层检查”
  • 在 JVM 层面仍然是合法的
  • 模块系统(Java 9+)可能会限制反射

四、反射的性能问题(原理层面)

反射比直接调用慢,原因:

  1. 方法查找(字符串 → Method)
  2. 访问权限检查
  3. 参数装箱 / 拆箱
  4. 无法被 JIT 充分内联优化

但:

  • MethodHandle
  • 缓存 Method / Field
  • 框架中大量使用反射但影响不大(调用不频繁)

五、反射在底层依赖什么

技术 作用
Class 对象 元数据存储
native 方法 实际执行
类加载器 提供 Class
JVM 规范 保证一致性

六、一句话总结

Java 反射的原理是:JVM 在类加载时为每个类生成一个 Class 对象,反射通过 Class 对象读取类的结构信息,并借助 JVM 提供的 native 接口在运行时动态创建对象、调用方法、访问字段。

如果你愿意,我也可以:

  • 画一张反射调用流程图
  • 对比反射 vs 普通调用
  • 讲 Spring / MyBatis 怎么用反射
  • 讲 Java 9 模块对反射的影响
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手