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

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

Что-то вроде этого?

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

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

Ответы

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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


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

Ответ 5

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

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