【问题标题】:Count Instances of Class计算类的实例
【发布时间】:2011-08-04 03:49:55
【问题描述】:

我正在寻找一种以编程方式获取 .NET 和 Java 中某个类类型的实例数量的方法。

例如,我有 Foo 类。我希望能够在同一进程中获取 Foo 的所有实例的当前计数。
但是我不能修改 Foo,所以一个带计数的静态 int 出来了。此外,我不能只将我创建的所有实例添加到某个静态列表中并对其进行计数。我只想说:

System.GC.numberOf< Foo >()

什么的。

我正在查看垃圾收集器,但找不到任何相关方法。

【问题讨论】:

  • 这有重复。到处搜索。
  • 有类似的问题,但答案总是涉及使用某种计数器修改类。我想计算我没有定义或控制的类的实例
  • 好吧,你不能。这也在一些答案中有所说明。
  • 跟踪您在您控制的代码中创建的对象数量。
  • 我已经使用工具来计算远程进程中的对象实例,这对于追踪泄漏非常有用。我希望有一种方法可以在同一程序中复制此逻辑以进行测试

标签: java .net testing


【解决方案1】:

如果你不能直接修改类(可能是因为它是一个内置类?),你可以创建一个包装器,或者继承原始的子类吗?

public class subFoo extends foo
{
    protected static int count = 0;

    public subFoo() 
    {
        count++;
        super();
    }

    protected void finalize() throws Throwable
    {
        count--;
        super.finalize();
    } 

    public static int getInstanceCount()
    {
        return count;
    }
}

这个例子是 Java 的,可能有一些语法问题,因为我有点生疏了。

当然,您必须确保在其余代码中将所有 foo 重新声明为 subFoo

【讨论】:

  • 这确实让我想到了,但不幸的是,我正在处理的是第三方库生成的对象。我想在运行自动化测试时计算这些对象,以确保它们被正确释放。 +1 阅读问题并提供一个很好的解决方案!
【解决方案2】:

另一种有点奇特的方法是使用面向方面的技术来检测相关类的构造函数。以AspectJ 为例。

【讨论】:

  • 打算为这个解决方案拍摄,因为我可能也可以用其他类似的方式检测 .net 类。
【解决方案3】:

您是否可以控制 Java VM 的运行方式?如果是这样,您可以编写一个快速而肮脏的调试器代理...http://download.oracle.com/javase/1.5.0/docs/guide/jvmti/jvmti.html#writingAgents

查看事件“VM 对象分配”和“对象释放”

【讨论】:

    【解决方案4】:

    如前所述,SO 中有类似的问题。
    您可以使用的一种技巧 - IMO 的一大技巧 - 是 更改 Object 类:请参阅 this answer

    简历:

    • 复制Object的来源
    • 向其构造函数添加计数(最终确定)
    • 添加读取计数的方法
    • 将包含已编译类的目录添加到引导类路径 (-Xbootclasspath)

    【讨论】:

      【解决方案5】:

      又快又脏:如果你不能改变类,也许你可以在项目的另一部分放一个计数器,当你实例化所说的类时增加它?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-26
        • 1970-01-01
        • 2011-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-26
        相关资源
        最近更新 更多