反射 API 能做什么,底层怎样实现?
查看完整题解
参考回答
直接回答
反射允许程序在运行时取得类、字段、方法和构造器的信息,并在权限允许时读取字段、调用方法或创建实例。Class 是入口之一,Method、Field、Constructor 表示对应成员。反射并不意味着可以无条件越过 private、模块边界或修改任意字段。
讲清原理
运行环境保存类的类型和成员信息,反射对象提供访问这些信息的 API。方法调用还涉及参数检查、访问检查以及实际目标调用;被调用方法抛出的异常通常通过 InvocationTargetException 包装。
实现细节要注明版本:OpenJDK 从 JDK 18 起,用方法句柄重新实现核心反射,不能继续把旧式“反射调用达到固定次数后生成访问器”当作 Java 21 的通用规则。API 契约与具体 JDK 的实现不是一回事。
例子与易错点
var method = String.class.getMethod("substring", int.class);
System.out.println(method.invoke("Java", 2)); // va
getMethod 主要查找 public 方法,也会考虑继承;getDeclaredMethod 查当前类型声明的成员,不保证有使用权限。trySetAccessible() 可能返回 false,深反射还受模块是否开放等条件限制。不要把反射当作绕过所有封装的万能工具。
相关题:第 33 题、第 51 题。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。