我正在尋找一種方法來獲取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