【问题标题】:How to get the instance of class如何获取类的实例
【发布时间】:2009-12-21 17:20:56
【问题描述】:

我在同一个包中创建了三个类 classA、classB 和 classC。现在我在classB中创建了三个classA对象,在classC中创建了两个classA对象。现在我怎样才能在 classA 中获得以下内容。

1) classB 和 classC 使用了多少个 classA 的对象? 2) 如何获取classB 和classC 中的classA 对象的名称和引用?

【问题讨论】:

  • 您是否想要这个类似于分析器所做的事情?

标签: java


【解决方案1】:

对于实例的总数,您可以在 A 类中有一个静态变量。静态变量是一个基于类本身而非实例的变量,其定义如下:

private static int totalInstances = 0;

然后在类 A 的构造函数中,您只需递增该变量,并在析构函数中递减它。

然后你可以为这个变量创建一个访问器

public int getTotalInstances(){
    return totalInstances;
}

然后您就可以像这样获得实例的总数:

classA.getTotalInstances()

确保将其设为类名而不是实例名。

如果你想跟踪引用变量,你可以创建一个引用变量的静态数组,并在每次创建对象时添加引用,就像我们增加实例总数一样:)

【讨论】:

  • 除了“析构函数”,我同意。您可以将减量放在覆盖的“finally”方法中,但不能保证在对该实例的最后一个引用被销毁后立即调用它。由 Big'GC 负责清理。
【解决方案2】:

你不能,除非你向每个 A 对象的 c'tor 提供对“所有者”的引用。

【讨论】:

    【解决方案3】:

    如果你这样做:

    public class B {
      private a1 = new A();
      private a2 = new A();
      private a3 = new A();
    }
    
    public class C {
      private a1 = new A();
      private a2 = new A();
    }
    

    ,那么您可以使用反射 API 来查找类型 A 的类成员并计算该类型的所有非 null 成员并反射 A 实例以获取对象 names(假设,你有一种A#getName() 方法)。

    如果你这样做(仅 B 的代码):

    public class B {
       public B() {
         new A();
         new A();
         new A();
       }
     }
    

    ,没有机会“查看 B 实例”并告诉已创建了多少 A。唯一的方法是像 Dominic 建议的那样使用 A 类仪器。但它不会告诉你,有多少个 A 存在,只是到目前为止已经创建了多少个 A。

    如果您需要更多详细信息,请使用众多分析器之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-30
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      • 1970-01-01
      相关资源
      最近更新 更多