代码之家  ›  专栏  ›  技术社区  ›  Dead Programmer

在Java中运行时存在一个类的实例

  •  2
  • Dead Programmer  · 技术社区  · 14 年前

    今天,在我的采访中,我被要求编写一个代码来确定一个类在Java中运行时退出的实例。

    我告诉他们,我们可以利用反省。如果你有有效的方法,请告诉我。

    3 回复  |  直到 14 年前
        1
  •  5
  •   mdma    14 年前

    我认为反思对你没有帮助。有 JVMTI (以及旧的和现在已失效的jmpi),可用于分析堆并确定类的当前实例数。

    另一种编码方法是向要跟踪的类添加计数器:

    class Myclass {
    
       static private final AtomicInteger count = new AtomicInteger();
    
       {
          count.getAndIncrement();
       }
    
       static public int instanceCount() { 
          return count.get();
       }
    
       // edit: account for serializable
       private void readObject(ObjectInputStream ois) 
           throws ClassNotFoundException, IOException {
          counter.getAndIncrement();
          ois.defaultReadObject();          
       }
    }
    

    这将跟踪曾经创建的实例的数量,并且是线程安全的。要查明何时对实例进行垃圾收集,可以使用 PhantomReference 和A ReferenceQueue 跟踪收集的实例并递减计数器。

    class Myclass {
    
       static private final AtomicInteger count = new AtomicInteger();
       static private final ReferenceQueue<MyClass> queue = new ReferenceQueue<MyClass>();
    
       {
          count.getAndIncrement();
          new PhantomReference<MyObject>(this, queue);
       }
    
       static public int instanceCount() { 
          return count.get();
       }
    
       static {
          Thread t = new Thread() {
             public void run() {
                for (;;) {
                   queue.remove();
                   count.decrementAndGet();
                }
             }
          };
          t.setDaemon(true);
          t.start();
       }
    
    }
    

    编辑:

    如果类是可序列化的,则实现 readObject 方法并递增计数器。我已经将它添加到第一个代码示例中。

        2
  •  1
  •   Noel M    14 年前

    如果通过提供访问器方法和provate构造函数(如singleton模式)来限制实例生成,那么可以计算创建新实例的次数。

        3
  •  1
  •   Matthew Flaschen    14 年前

    我不认为你能为一个有反省的任意类做这件事。可能他只是希望您添加一个静态计数器字段:

    public class Foo
    {
      private static int counter = 0;
      public Foo()
      {
        counter++;
      }   
    }