如何解决类的计数实例
| 我正在寻找一种以编程方式获取.NET和Java中某个类类型的实例数量的方法。 举例来说,我上了Foo课程。我希望能够在同一过程中获得Foo所有实例的当前计数。 但是我无法修改Foo,因此带有计数的静态int消失了。另外,我不能只将我创建的所有实例添加到某个静态列表中并对其进行计数。我希望能够说:System.GC.numberOf< Foo >()
或者其他的东西。
我一直在寻找垃圾收集器,但找不到任何相关方法。
解决方法
另一种异乎寻常的方法是使用面向方面的技术来检测所讨论类的构造函数。例如,看一下AspectJ。
,如果您不能直接修改该类(也许是因为它是内置类?),您可以创建包装器还是继承原始类的子类?
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
。
,您可以控制Java VM的运行方式吗?如果是这样,您可以编写一个快速且肮脏的调试器代理... http://download.oracle.com/javase/1.5.0/docs/guide/jvmti/jvmti.html#writingAgents
查看事件“ VM对象分配”和“对象免费”
,如前所述,SO中也存在类似的问题。
您可以使用的一种技巧-一个很大的IMO-是更改Object
类:请参阅此答案
恢复:
复制对象的来源
将计数添加到其构造函数(完成)
添加方法以读取计数
将带有编译类的目录放在引导类路径(-Xbootclasspath)的前面
,快速又肮脏:如果您不能更改类,也许可以只在项目的另一部分放置一个计数器,在实例化所述类时就增加它?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。