是否可以通过将此类的名称作为字符串输入来获取类的所有实例?
这样的东西?
var instances = Reflection.findClass("com.someone.MyClass").getInstances();
感谢任何反馈。感谢。
答案 0 :(得分:8)
不,没有可用的东西。如果您挂钩到调试API,您可以执行此操作,但在“正常”运行时则不行。
答案 1 :(得分:5)
我不知道在运行时这样做的方法,但是,如果您乐意“离线”,可以执行以下操作:
select * from com.someone.MyClass
等命令。运行此查询将在执行堆转储时返回内存中的实例。答案 2 :(得分:3)
这是剖析器有用的东西。使用YourKit,您可以根据通配类搜索实例,并从最大到最小或其他一些排序标准检查/导航它们。
答案 3 :(得分:1)
This answer使用各种检测API提供了一些选项。但这些通常适用于在单独的JVM中运行的应用程序,它们需要停止JVM并遍历堆中的所有对象以查找相关实例。
JVM不会保留每个类的所有实例的任何内部集合。但是你可以自己做这样的事情......如果你在你感兴趣的每个特定类或类中实现行为。你只需要小心避免通过保留对实例的引用来创建内存泄漏。收藏垃圾。
答案 4 :(得分:1)
这里的问题不是找到类对象(这可以通过Class.forName()
完成),但通常一个类不知道它的实例。
如果您可以控制您的类,则可以创建所有实例的注册表,并在构造函数中将每个实例添加到此实例中。但是你应该小心不要禁用垃圾收集,所以使用弱引用而不是普通引用。