Как программно создать экземпляр динамически загруженного класса из значений в файле? - PullRequest
1 голос
/ 27 октября 2011

У меня есть базовые знания API рефлексии Java - поэтому вопрос не только в том, как это сделать, но и в том, возможно ли это, и я собираюсь найти решение наилучшим образом.Вы проводите приемочные испытания нескольких взаимосвязанных проектов;каждый из этих проектов извлекает данные из хранилища MongoDB, используя собственный API абстракции.Чтобы облегчить это тестирование, каждому компоненту нужны предварительно загруженные данные, которые будут доступны в базе данных.

Я создаю инструмент командной строки для принятия DTO (предварительно скомпилированного двоичного файла класса) для загрузки нескольких экземпляров с использованием библиотеки morphia ORM.Я хотел бы, чтобы каждый член нашей команды мог запускать генератор, передавая через свой DTO (в виде jar или директории) и файл (csv или другой) для создания желаемого количества записей.* У меня классная загрузка работает нормально с URLClassLoader.Теперь я пытаюсь создать экземпляр этого класса, используя данные из файла.

Возможно ли это?Будет ли сериализованные объекты лучшим подходом?

Ответы [ 2 ]

3 голосов
/ 27 октября 2011

Это вполне возможно при использовании Java Reflection API:

  • Загрузка экземпляра класса по имени (Class.forName (className), вам на самом деле не нужен экземпляр ClassLoader)
  • Захватите экземпляр конструктора конструкторов с параметрами и вызовите newInstance (Object ... args) для этого экземпляра конструктора, чтобы создать экземпляр вашего класса DTO.
  • Вызовите getDeclaredFields () для вашего экземпляра Class и выполните итерации по ним, чтобы установить их значения (field.set (instance, value)). Обязательно вызовите field.setAccessible (true), чтобы иметь доступ к закрытым полям.
0 голосов
/ 27 октября 2011

Если под «сериализованными объектами» вы подразумеваете стандартные экземпляры, то нет, загружая свойства из текстового файла, вы значительно упрощаете настройку тестовых данных (если это цель), включая количество объектов.

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

...