Динамически создавать классы в Java - PullRequest
2 голосов
/ 23 сентября 2010

Я хотел бы создать класс в Java на основе полей, определенных в моем файле конфигурации XML:

Например: если файл XML содержит (синтаксис был размечен для публикации):

<property name="agent_host"></property>
<property name="subsystem"></property>

тогда внутри он создаст класс Event, такой как Event (String agentHost, String subSystem), который клиент может создать.Примечание: клиент всегда знает, что этот класс будет называться «Event», но не знает, сколько «обязательных параметров» ему нужно передать.

С другой стороны, если у меня есть XML-файл с:

<property name="agent_host"></property>

, он создаст событие (String eventHost), которое клиент может использовать для создания экземпляра.

Ответы [ 4 ]

2 голосов
/ 23 сентября 2010

Да, вы можете использовать рефлексию, но мне приходит в голову работа с классом, в который вы можете добавить свойство. Представьте себе класс, в котором есть один инкапсулированный HashMap, использующий String в качестве ключа (для имени атрибута) и значение атрибута, чтобы вы могли прочитать файл XML и для свойства evey добавить атрибут в класс как. Для этой строки:

<property name="subsystem" type="String">value123</property>


GenericClass c = new GenericClass();
c.addAttribute("subsystem", new String("value123"));
//and you could implement a get and set methods like this:
public String getAttributeValue(String attributeName)
{
   return internalHashMap.get(attributeName).toString();
}

Используя это, вы также можете реализовать setAttributeValue будет довольно просто я думаю

1 голос
/ 23 сентября 2010

Если вы действительно заинтересованы в создании класса динамически, попробуйте библиотеки расширения байт-кода, такие как BCEL от Apache.

1 голос
/ 23 сентября 2010

Я думаю, что DynaBean от Commons-BeanUtils может быть тем, что вы ищете.

DynaBean - это объект Java, который поддерживает свойства, имена и типы данных которыха также значения, могут быть динамически изменены.В максимально возможной степени другие компоненты пакета BeanUtils распознают такие bean-компоненты и рассматривают их как стандартные JavaBeans с целью получения и установки значений свойств.

1 голос
/ 23 сентября 2010

Это не тот класс, который вам нужен, это данные.Почему бы не использовать хэш-карту?Мне действительно не нравятся классы в стиле «Бин» - они поощряют плохое кодирование (в сгенерированном классе нет места для вставки реального кода, так что все в конечном итоге все манипулируется внешним кодом).

Вы можете просто загрузитьхеш-карту из вашего XML и внедрить ее в реальный объект - таким образом, вам не нужно беспокоиться о фактической передаче хеш-кода, вы передаете реальный объект с настоящими бизнес-методами и реальной безопасностью типов - это просто ПРОИСХОДИТиспользуйте внутреннюю хеш-карту для хранения данных вместо переменных-членов.

Я сделал гораздо больше, чем это, но в какой-то момент вы понимаете, что Hibernate делает все, что вы хотите.

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