3 回答
TA贡献1829条经验 获得超4个赞
在类中创建一个静态变量。
public static int callerCounter=0;.
然后在每个构造函数中递增它。例如:-
Demo()
{
callerCounter++; // Add this line in every Constructor
}
callerCounter并在您想要获得计数器值的地方打印。
TA贡献1810条经验 获得超4个赞
创建一个静态 Set callerClasses 来保存调用 Demo 类的每个类的名称。
然后,在每次调用 Demo 类时,将调用者姓名添加到集合中。
在任何时候,您都可以通过检查 Set 大小来检查有多少不同的类调用了您的 Demo 类。
编辑注释#1:
在我发布我的答案后,这个问题就很清楚了,即意图不是计算方法调用而是计算创建的实例。
无论如何我都会保留它,因为这可能是其他人的情况。
编辑注#2:
为完整性添加了代码示例。
public class Demo {
// ConcurrentSkipListSet for thread safety
private static Set<String> callerCount = new ConcurrentSkipListSet<>();
public void methodA() {
String className = new Exception().getStackTrace()[1].getClassName();
recordCaller(className);
}
public long getNumberOfCallers() {
return callerCount.size();
}
private void recordCaller(final String className) {
callerCount.add(className);
}
}
TA贡献1951条经验 获得超3个赞
我认为在一般情况下仅通过分析代码是不可行的。如果接口正在使用中,知道在接口后面将实例化哪个类可能并非易事。这可能取决于某些工厂内的决定,并且可能会受到仅在运行时可用的输入的影响,甚至在理论上受 SecureRandom 的影响。
您始终可以放置计数器或仅记录语句(单独处理日志输出)以在运行时收集此类统计信息。JProfiler 之类的工具可以作为无需编程的替代工具。
添加回答
举报
