instrumentation.getallloadedclasses() 返回当前jvm所有已加载类的class对象数组,用于类加载检查、内存估算、诊断工具等,但不能获取变量值或声明细节;需结合getdeclaredfields()等反射方法分析类结构。

Instrumentation.getAllLoadedClasses() 返回的是当前 JVM 中所有已加载的类(Class> 对象)的数组,但它不直接返回变量或字段信息,也不提供类中定义的变量(如静态变量、实例变量)的具体值或声明细节。
它能做什么?
该方法用于获取 JVM 已加载的完整类列表,常用于:
- 类加载状态检查(比如确认某个类是否已被加载)
- 配合
Instrumentation.getObjectSize()估算对象内存占用 - 辅助实现类扫描、热替换、监控或诊断工具(如内存泄漏分析)
- 与
Class.getDeclaredFields()等反射方法组合使用,进一步分析类结构
它不能做什么?
不能直接:
- 获取某个变量的运行时值(需通过反射 + 实例/类引用调用
Field.get()) - 列出某类中所有变量名(需先拿到 Class,再调用
getDeclaredFields()) - 区分变量是局部变量、参数还是成员变量(局部变量无法通过类反射获取)
- 绕过访问控制自动读取 private 字段(仍需
setAccessible(true))
如何结合反射获取变量信息?
若你想“检索某个类的变量定义”,典型流程是:
- 用
getAllLoadedClasses()找到目标类(例如遍历匹配类名) - 对目标
Class>调用getDeclaredFields() - 遍历返回的
Field[],获取名称、类型、修饰符等元数据
示例片段:
for (Class> clazz : inst.getAllLoadedClasses()) {<br> if ("com.example.MyService".equals(clazz.getName())) {<br> Field[] fields = clazz.getDeclaredFields();<br> for (Field f : fields) {<br> System.out.println(f.getName() + " : " + f.getType());<br> }<br> }<br>}
注意事项
- 必须通过 Java Agent 启动并获取
Instrumentation实例,普通应用无法直接调用 - 返回的类数组不保证顺序,也不包含尚未加载的类(哪怕已编译)
- 无法获取 Lambda 生成的合成类中的“隐式变量”,也不能反映栈帧里的局部变量
- 频繁调用或遍历大量类可能影响性能,生产环境慎用










