Java反射:如何通过输入类名获取该类的实例?

19

是否可以通过输入类名字符串来获取该类的所有实例?

像这样吗?

var instances = Reflection.findClass("com.someone.MyClass").getInstances();

欢迎提供任何反馈。谢谢。


相似问题:“使用Java反射,是否可以获取本地变量的名称?” https://dev59.com/mHRB5IYBdhLWcg3wCjYV - David Koelle
如果您想知道运行时类的实例数量,将引用保存在成员变量中将给您访问权限。 - Dead Programmer
5个回答

9

很抱歉,目前没有类似的可用内容。如果您连接到调试API,则可能能够执行此操作,但在“正常”运行时无法执行。


5

我不知道有没有一种在运行时实现这个的方法,但是如果你愿意“离线”完成它,你可以按照以下步骤操作:

  1. 获取堆转储文件
  2. 加载堆转储文件到Eclipse MAT
  3. 打开OQL窗格,并输入类似于select * from com.someone.MyClass的命令。运行此查询将返回在获取堆转储文件时内存中存在的实例。

3

这是分析器擅长的事情。使用YourKit,您可以基于通配符类搜索实例,并按照最大到最小或其他排序标准进行检查/导航。


1

这个答案提供了一些使用各种仪器API的选项。但是这些通常在一个单独的JVM中运行的应用程序上工作,并且它们需要停止JVM并遍历堆中的所有对象以查找相关实例。


JVM不会保留每个类的所有实例的内部集合。但是,您可以自己做这种事情...如果您在每个特定类或您感兴趣的类中实现行为。您只需要小心避免保留对本应该被收集的垃圾实例的引用,以避免创建内存泄漏。

1
这里的问题不在于找到类对象(可以通过Class.forName()实现),而是通常情况下,一个类并不知道它的实例。
如果您对类具有控制权,则可以创建所有实例的注册表,并在构造函数中将每个实例添加到其中。但是,您应该小心,不要通过此禁用垃圾回收,因此请使用弱引用而不是普通引用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接