Java: динамические свойства

Дамы и Господа,

Я плохо знаком с Java, прощаю мне, если это очевидно, но я не нашел много об этом.

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


Причина: Я хочу сохранить модель данных в GAE, который может быть расширен динамично после компиляции приложения (да, DataStore позволяет это). Какие свойства должны быть добавлены, хранятся в DataStore также (Он похож на Роботы использования к созданным Роботам... забавным).

Python позволяет мне добавлять свойства в Runtime. Groovy, кажется, позволяет это, также. Единственная вещь в "чистом" указании мира Java в том направлении, кажется, "Динамические Прокси".

Но я еще не мог выяснить, добиваются ли они цели.

12
задан thomas 7 February 2010 в 01:35
поделиться

3 ответа

Java не имеет возможности динамически добавлять свойства. Также у него нет возможности динамически создавать классы во время выполнения или изменять их во время выполнения. Java строго и статически типизирован. Лучшее, что вы можете сделать, - это поместить такие свойства в Map или аналогичный.

Редактировать: Хорошо, по-видимому, нужны некоторые пояснения. OP специально упомянул GAE, с которым ни один из этих методов не будет работать, но я упомяну их, поскольку некоторые, похоже, возражают против их отсутствия.

Java Compiler API (Java 6+) позволяет компилировать классы Java во время выполнения. Технически вы можете написать исходный файл Java, чтобы он выглядел именно так, как вы хотите, скомпилировать и загрузить.

Библиотеки байт-кода Java могут переписывать классы во время выполнения. Это используется такими библиотеками, как JPA (и другими). Таким образом вы можете изменять классы.

OP, однако, имеет в виду а) ссылку на работу над GAE и б) больше в том порядке, в котором Javascript позволяет вам изменять классы или конкретные экземпляры во время выполнения путем динамического добавления, удаления или изменения свойств. Java определенно не делает этого, особенно в GAE.

Вышеупомянутое не является исключением из этого правила, так же как приведение класса к char * в C ++, чтобы вы могли читать закрытые члены, не означает, что C ++ не имеет закрытых членов. По сути, вы обойдете среду выполнения Java с помощью обоих этих методов, даже если они являются частью Java.

10
ответ дан 2 December 2019 в 20:17
поделиться

Java не поддерживает это. Лучше всего хранить / управлять в каком-либо внешнем хранилище данных, к которому вы можете получить доступ изнутри кода Java. В качестве базового и встроенного примера вы можете использовать java.util.Properties API, который вы загружаете при каждом запросе, или кешируете и перезагружаете через определенные интервалы, или перезагружаете программно. Затем вы можете сохранить пары ключ-значение в файле .properties , который вы просто поместите в путь к классам. Вот учебник Sun по теме .

Файл свойств может выглядеть так

key1=value1
key2=value2
key3=value3

Если вы поместите его в путь к классам, вы можете загрузить его как

Properties properties = new Properties();
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
properties.load(classLoader.getResourceAsStream("file.properties"));
String key1 = properties.getProperty("key1"); // value1

Другими альтернативами являются, например, файлы XML (к которым вы можете получить доступ с помощью любого Java XML API) или просто база данных (доступ к которой можно получить с помощью JDBC API).

2
ответ дан 2 December 2019 в 20:17
поделиться

Я не знаю, является ли это опцией на GAE (я не проверял ограничения) и будет ли это соответствовать Вашим потребностям, но, возможно, посмотрите на класс BeanGenerator от CGLIB (альтернатива уродливому DynaBean от BeanUtils). Цитируя "Смерть DynaBeans" (посмотрите на пост):

Никому не позволено позволить моему CGLIB Золотой молоток ...идут впустую, я проверила... в классе BeanGenerator в CVS. Вы используйте его так:

BeanGenerator bg = new BeanGenerator();
bg.addProperty("foo", Double.TYPE);
bg.addProperty("bar", String.class);
Объект bean = bg.create();

Генерируемый класс является вещественным. JavaBean, что означает, что вы можете использовать стандартные бобовые утилиты. Это включает в себя все занятия по net.sf.cglib.beans package (BeanCopier, BeanMap и BulkBean). Сделайте все возможное, чтобы положить конец тирании Дайнабинс!

2
ответ дан 2 December 2019 в 20:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: