我正在寻找一种方法来获取Java中给定类型的所有实例化对象。Java的Ruby等价物ObjectSpace.each_object
随着Ruby中,你可以使用ObjectSpace.each_object方法:
a = 102.7
b = 95.1
ObjectSpace.each_object(Numeric) {|x| p x }
会给
95.1
102.7
我正在寻找一种方法来获取Java中给定类型的所有实例化对象。Java的Ruby等价物ObjectSpace.each_object
随着Ruby中,你可以使用ObjectSpace.each_object方法:
a = 102.7
b = 95.1
ObjectSpace.each_object(Numeric) {|x| p x }
会给
95.1
102.7
没有Java的等效于此。
你可以在Java中做这样的事情的唯一方法就是让每个类创建并维护所有实例的集合。国际海事组织,这是一个坏主意,除非有特殊情况证明管理费用是合理的。首先,“所有实例”集合需要以避免垃圾留存的方式实现。
我不知道你是否可以这样做。一个想法,虽然 - 有垃圾收集器的运行时接口? GC应该跟踪所有当前活动的对象。你可能会以某种方式挂钩它来获取这些信息,并使用运行时检查来确定哪些对象有你正在寻找的类。
This article可能值得一看。前段时间我偶然发现了Java的Reflection API,我非常喜欢它。尽管我曾与之谈过的每个Java程序员都说,这是撒旦的产物。
如果这并不能使你想学习它,我不知道会发生什么。
反射API中的任何内容都不允许您迭代类的所有实例。 – 2009-12-06 08:41:51
我立即纠正 – 2009-12-06 19:53:02
Java调试接口(JDI)在Java 6.0中有新的方法,它们允许用Java本身编写的工具进行一些有限的内存分析。例如,ReferenceType
有一个实例方法,它允许工具获取对该类型的所有实例的引用。
JRuby中不支持ObjectSpace.each_object(或至少他们想不支持它),因为Java本身不支持它,并通过保持弱引用实现它极大地伤害了效率。 – 2009-12-07 17:22:24