Количество экземпляров класса - PullRequest
2 голосов
/ 12 апреля 2011

Я ищу способ программно получить количество экземпляров определенного типа класса в .NET и Java.

Скажем, например, у меня есть класс Foo. Я хочу иметь возможность в том же процессе получить текущий счетчик всех экземпляров Foo.
Однако я не могу изменить Foo, поэтому статический int с подсчетом отсутствует. Также я не могу просто добавить все экземпляры, которые я делаю, в некоторый статический список и посчитать это. Я хочу иметь возможность просто сказать:

System.GC.numberOf< Foo >()

или что-то.

Я просматривал сборщики мусора, но не смог найти подходящих методов.

Ответы [ 5 ]

5 голосов
/ 12 апреля 2011

Если вы не можете изменить класс напрямую (возможно, потому что это встроенный класс?), Не могли бы вы создать оболочку или подкласс, который наследует оригинал?

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 в остальной части вашего кода.

2 голосов
/ 13 апреля 2011

Другим несколько экзотическим способом сделать это было бы использование аспектно-ориентированных методов для инструктирования конструктора (ов) рассматриваемого класса (классов).Взгляните, например, на AspectJ .

2 голосов
/ 12 апреля 2011

У вас есть контроль над тем, как работает Java VM? Если это так, вы можете написать быстрый и грязный агент отладчика ... http://download.oracle.com/javase/1.5.0/docs/guide/jvmti/jvmti.html#writingAgents

См. События «Распределение объектов ВМ» и «Свободный объект»

1 голос
/ 13 апреля 2011

Как уже отмечалось, в SO есть похожие вопросы.
Один взлом, который вы можете использовать - большой IMO, - это изменение класс Object: см. этот ответ

Резюме:

  • копировать источник объекта
  • добавить подсчет в его конструктор (финализировать)
  • добавить метод для чтения счетчика
  • добавьте каталог с скомпилированным классом в путь к загрузочному классу (-Xbootclasspath)
0 голосов
/ 12 апреля 2011

Быстро и грязно: если вы не можете изменить класс, может быть, вы можете просто поставить счетчик в другой части проекта, увеличивая его при создании экземпляра указанного класса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...