计算类的实例

时间:2011-04-12 19:04:55

标签: java .net testing

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

比如说我有Foo课。我希望能够在同一个过程中获得Foo所有实例的当前计数 但是我无法修改Foo,所以带有计数的静态int已经出来了。此外,我不能只将我所做的所有实例添加到某些静态列表中并计算它。我希望能够说:

System.GC.numberOf< Foo >()

或其他什么。

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

5 个答案:

答案 0 :(得分:5)

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

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)

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

查看事件“VM Object Allocation”和“Object Free”

答案 2 :(得分:2)

另一种有点奇特的方法是使用面向方面的技术来检测所讨论的类的构造函数。例如,请查看AspectJ

答案 3 :(得分:1)

正如已经评论的那样,SO中也有类似的问题 你可以使用的一个黑客 - 一个大的IMO - 是更改 Object类:见this answer

简历:

  • 复制对象的来源
  • 向其构造函数添加计数(finalize)
  • 添加方法以读取计数
  • 将带有已编译类的目录添加到引导类路径(-Xbootclasspath)

答案 4 :(得分:0)

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