Java Reflection:通过输入名称来获取给定类的实例?

是否可以通过将此类的名称作为字符串输入来获取类的所有实例?

像这样的东西?

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

任何反馈都表示赞赏。 谢谢。

不,没有那样可用。 如果您挂钩到调试API,您可以这样做,但不能在“正常”运行时。

我不知道在运行时这样做的方法,但是,如果你很乐意“离线”,你可以执行以下操作:

  1. 进行堆转储
  2. 将堆转储装入Eclipse MAT
  3. 打开OQL窗格,然后输入命令,例如select * from com.someone.MyClass 。 运行此查询将在执行堆转储时返回内存中的实例。

这是剖析器有用的东西。 使用YourKit,您可以搜索基于通配类的实例,并从最大到最小或其他排序条件检查/导航它们。

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


JVM不保留每个类的所有实例的任何内部集合。 但是你可以自己做这样的事情……如果你在你感兴趣的每个特定类或类中实现行为。你只需要小心避免通过保留对实例的引用来创建内存泄漏。可收集的垃圾。

这里的问题是找不到类对象(这可以通过Class.forName()来完成),但通常一个类不知道它的实例。

如果您可以控制您的类,则可以创建所有实例的注册表,并在构造函数中将每个实例添加到此实例中。 但是你应该小心不要禁用垃圾收集,所以使用弱引用而不是普通引用。