Отражение Java: получить экземпляры данного класса, найденные путем ввода его имени? - PullRequest
16 голосов
/ 21 февраля 2011

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

Как то так?

var instances = Reflection.findClass("com.someone.MyClass").getInstances();

Любые отзывы приветствуются. Спасибо.

Ответы [ 5 ]

8 голосов
/ 21 февраля 2011

Нет, ничего подобного нет. Если вы подключитесь к API отладки, вы сможете это сделать, но не при нормальном запуске.

5 голосов
/ 21 февраля 2011

Я не знаю, как это сделать во время выполнения, но, если вы счастливы сделать это в автономном режиме, вы можете сделать следующее:

  1. Взять дамп кучи
  2. Загрузите дамп кучи в Eclipse MAT
  3. Откройте панель OQL и введите команду, например select * from com.someone.MyClass.Выполнение этого запроса вернет экземпляры в памяти во время создания дампа кучи.
3 голосов
/ 21 февраля 2011

Это то, для чего хороши профилировщики. С помощью YourKit вы можете искать экземпляры, основанные на подстановочных символах, и просматривать / перемещаться по ним от самых больших к наименьшим или другим критериям сортировки.

1 голос
/ 21 февраля 2011

Проблема здесь не в том, чтобы найти объект класса (это может сделать Class.forName()), а в том, что обычно класс не знает о своих экземплярах.

Если у вас есть контроль над вашим классомВы можете создать реестр всех экземпляров и добавить каждый экземпляр к нему в конструкторе.Но вы должны быть осторожны, чтобы не отключить сборку мусора, поэтому используйте слабые ссылки вместо обычных.

1 голос
/ 21 февраля 2011

Этот ответ предоставляет некоторые варианты с использованием различных API инструментовок. Но они обычно работают в приложении, работающем в отдельной JVM, и влекут за собой остановку JVM и просмотр всех объектов в куче, чтобы найти соответствующие экземпляры.


JVM не хранит никаких внутренних коллекций всех экземпляров каждого класса. Но вы можете делать такие вещи самостоятельно ... если вы реализуете поведение в каждом конкретном классе или классах, которые вас интересуют. Вам просто нужно быть осторожным, чтобы избежать утечки памяти, сохраняя ссылки на экземпляры, которые в противном случае были бы коллекционный мусор.

...