你可以在Java中遍历特定类的每个对象吗?

时间:2012-02-06 01:14:35

标签: java object

在Java中是否有办法遍历特定类的每个对象,或者我是否必须跟踪每个对象,因为我使用引用数组构造/销毁并访问对象数据?

8 个答案:

答案 0 :(得分:2)

在Java中,我会在新对象(构造函数)的aspects上使用initialization和切入点

此工具不会干扰应用程序的正常运行,您也可以根据需要打开或关闭此功能。

目前大多数java工具都支持方面。

答案 1 :(得分:1)

获取特定任意类的所有对象列表而不修改任何现有代码的唯一方法是探索Java垃圾收集器的精彩世界。

我认为你不想这样做,尽管理论上可行。更简单的方法是让父类构造函数在创建时跟踪每个实例,并使用一些静态处理程序注册它。

但最好的方法可能是使用工厂模式,其中“工厂”类负责制造和跟踪相关类的实例。

编辑:请注意,您不希望在此类中保留对该对象的强引用,或者您将阻止释放任何对象的内存。 <{3}}将是必要的。

答案 2 :(得分:1)

我认为没有办法。问题是:什么时候在java中释放一个对象? vm使用类似于引用计数器的东西,当它变为0时,对象不再可用。所以vm本身不能提供这样的功能,因为它需要至少一个对象的引用,或者从不进行垃圾收集。当您自己创建对象时,使用简单的集合始终跟踪是相当容易的。

答案 3 :(得分:1)

您可以通过将每个新实例存储在静态WeakHashSet中来跟踪类的所有实时(也可能是一些额外的)实例。但我不得不同意你的设计听起来很可疑。从你的更详细的描述来看,它听起来像窗口需要一组元素(如果它还没有),它应该是可以在屏幕上绘制它们。

答案 4 :(得分:0)

如果没有对象的引用,它们将成为垃圾收集的候选者。所以,是的,你必须以某种方式跟踪它们。您可以但不必使用数组;还有Java的collections

答案 5 :(得分:0)

有些库可以让你能够导航对象图。看看commons-ognl here:http://commons.apache.org/ognl/

引用来自此处的开发指南:http://commons.apache.org/ognl/developer-guide.html

“OGNL作为一种语言允许通过简洁的语法导航Java对象,该语法允许在可能的情况下指定对称可设置和可获取的值。该语言指定一种语法,试图提供尽可能高的抽象级别。用于导航对象图;这通常意味着指定通过JavaBeans属性,集合索引等的路径,而不是直接访问属性getter和setter(统称为访问器)。“

自从我使用它已经有一段时间了,但当时它是不可或缺的。

答案 6 :(得分:0)

你能做到的唯一方法就是在你想要关注的类中保留一个静态List,然后在构造函数中将每个对象添加到该列表中。

你必须知道,垃圾收集器不再收集任何这些对象,即使你可能不再使用它们了。

答案 7 :(得分:0)

根据这个SO question,似乎没有可能在Java中有效地做到这一点。这里讨论了一些相当繁重的方法,它们有点超出我的范围,但这个问题中的海报似乎问了一些类似于你所描述的内容,并最终在他们的编辑中得出结论,它似乎并不是很容易实现。