Java 反射(Reflection)是 Java 在运行时动态获取类信息并操作类成员的一种机制。它的核心原理可以概括为:JVM 在加载类时,会把类的结构信息封装成 Class 对象,反射就是通过这些 Class 对象来反向操作类。
下面从原理层面分点说明:
当 JVM 加载一个类(如 User.class)时:
.class 文件读入内存Class 对象
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");
底层流程:
clazz.getMethod()Method.invoke()invokevirtual)也就是说:
反射本质 = Class 元数据 + JVM 提供的 native 调用能力
Java 的访问控制是编译期 + JVM 运行期双重检查:
private 是给编译器看的setAccessible(true) 会 关闭访问检查field.setAccessible(true);
field.set(obj, value);
注意:
反射比直接调用慢,原因:
但:
MethodHandleMethod / Field| 技术 | 作用 |
|---|---|
| Class 对象 | 元数据存储 |
| native 方法 | 实际执行 |
| 类加载器 | 提供 Class |
| JVM 规范 | 保证一致性 |
Java 反射的原理是:JVM 在类加载时为每个类生成一个 Class 对象,反射通过 Class 对象读取类的结构信息,并借助 JVM 提供的 native 接口在运行时动态创建对象、调用方法、访问字段。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。