Дамы и Господа,
Я плохо знаком с Java, прощаю мне, если это очевидно, но я не нашел много об этом.
Я хотел бы создать динамические свойства (переменные) для класса во времени выполнения (определите объект, который может быть изменен во времени выполнения путем добавления или изменения свойств и методов).
Причина: Я хочу сохранить модель данных в GAE, который может быть расширен динамично после компиляции приложения (да, DataStore позволяет это). Какие свойства должны быть добавлены, хранятся в DataStore также (Он похож на Роботы использования к созданным Роботам... забавным).
Python позволяет мне добавлять свойства в Runtime. Groovy, кажется, позволяет это, также. Единственная вещь в "чистом" указании мира Java в том направлении, кажется, "Динамические Прокси".
Но я еще не мог выяснить, добиваются ли они цели.
Java не имеет возможности динамически добавлять свойства. Также у него нет возможности динамически создавать классы во время выполнения или изменять их во время выполнения. Java строго и статически типизирован. Лучшее, что вы можете сделать, - это поместить такие свойства в Map
или аналогичный.
Редактировать: Хорошо, по-видимому, нужны некоторые пояснения. OP специально упомянул GAE, с которым ни один из этих методов не будет работать, но я упомяну их, поскольку некоторые, похоже, возражают против их отсутствия.
Java Compiler API (Java 6+) позволяет компилировать классы Java во время выполнения. Технически вы можете написать исходный файл Java, чтобы он выглядел именно так, как вы хотите, скомпилировать и загрузить.
Библиотеки байт-кода Java могут переписывать классы во время выполнения. Это используется такими библиотеками, как JPA (и другими). Таким образом вы можете изменять классы.
OP, однако, имеет в виду а) ссылку на работу над GAE и б) больше в том порядке, в котором Javascript позволяет вам изменять классы или конкретные экземпляры во время выполнения путем динамического добавления, удаления или изменения свойств. Java определенно не делает этого, особенно в GAE.
Вышеупомянутое не является исключением из этого правила, так же как приведение класса к char *
в C ++, чтобы вы могли читать закрытые члены, не означает, что C ++ не имеет закрытых членов. По сути, вы обойдете среду выполнения Java с помощью обоих этих методов, даже если они являются частью Java.
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).
Я не знаю, является ли это опцией на 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
). Сделайте все возможное, чтобы положить конец тирании Дайнабинс!