【问题标题】:JAVA: Getting a count, how many times a class is being called in other classes [duplicate]JAVA:计数,在其他类中调用一个类的次数[重复]
【发布时间】:2019-02-11 08:22:58
【问题描述】:

假设我有一个 demo.java 类和其他类,如 A.java 、 B. Java 等。

我想在 Demo.java 中编写一些代码来获取计数,这将告诉有多少类 Demo.java 被调用。

任何建议都会有所帮助。提前致谢!

【问题讨论】:

  • 你的意思是,它被实例化了多少次?或者你也在考虑方法调用
  • @Tarun:是的!我的意思是它被实例化了多少次。
  • 但是当然:A) 一个普通的简单 int 计数器不是线程安全的,如果这很重要,你应该使用 AtomicInteger B) 计算实例的整个想法在现实世界中什么都做不了。

标签: java


【解决方案1】:

在类中创建一个静态变量。
public static int callerCounter=0;

然后在每个构造函数中递增它。例如:-

Demo()
{
callerCounter++; // Add this line in every Constructor
}

然后打印callerCounter 你想得到计数器值的地方。

【讨论】:

  • 谢谢,瓦伦!我试过这个。如果我在 Demo 类本身中创建对象,这将有效。但是我在一个单独的类文件中调用 Demo.java 说是 A,那就不行了。
  • @Kaustubh 将静态变量公开,因为您可能从不同的包调用它
  • 谢谢。我公开了静态变量。但是,它仍然无法正常工作。正如您所建议的,如果在每个类构造函数中添加计数器行,我将如何获得总数?
  • @Kaustubh 静态变量只会存储计数,直到程序或调用者类被终止。如果您想要在程序终止后保存计数的计数器。然后你需要使用数据库或在文件中写入计数器。
  • 为了线程安全,我会使用 callerCount AtomicInteger。
【解决方案2】:

我认为在一般情况下仅通过分析代码是不可行的。如果接口正在使用中,知道在接口后面将实例化哪个类可能并非易事。这可能取决于某些工厂内的决定,并且可能会受到仅在运行时可用的输入的影响,即使理论上是 SecureRandom。

您始终可以放置计数器或仅记录语句(单独处理日志输出)以在运行时收集此类统计信息。 JProfiler 之类的工具可以作为无需编程的替代工具。

【讨论】:

    【解决方案3】:

    创建一个静态 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);
      }
    }
    

    【讨论】:

    • 各位大神,你怎么知道什么类叫方法?
    • 有趣的阅读,我建议您将相关代码添加到您的答案中,因为这部分对于如何解决这个问题至关重要。
    猜你喜欢
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多