Кто-либо знает то, что приближается, можно взять для автоматической генерации исходного кода Java, от, например, xml или json файла, в затмении?
Один яркий пример того, что я думаю о выполнении, - то, что делает Google Android sdk: им генерировали класс R автоматически от ресурсов.
Каждый раз, когда файл ресурсов сохраняется в Eclipse R, класс автоматически повторно создан.
ОБНОВЛЕНИЕ: Пример: В тексте (xml или json файл) у меня есть следующее:
The first alpha tag.
231232
This is the beta tag.
231232
Затем в моем сгенерированном классе Java, скажите R, как который у меня было бы что-то:
R.tags.ids.ALPHA //refers to an enum value for example
R.tags.values.ALPHA //refers to final int with avlue 231232
R.tags.descriptions.ALPHA //refers to the String with description
Спасибо!
Я добавляю еще один ответ на основе ваших комментариев, а также потому, что я действительно не рекомендую делать это за пределами Google Android Resource SDK. Google в основном использует иерархию статических классов (синглтонов) для своих ресурсов. Вам нужно заставить ваш XSLT генерировать статические переменные-члены вместо методов получения и установки.
В основном я взял свой старый ответ и изменил его на статический для всех переменных-членов. Вы должны быть очень осторожны, делая это, потому что я видел очень много ошибок с неправильным использованием модификатора static.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:template match="/" priority="100">
public class <xsl:value-of select="name(node())" /> {
<xsl:apply-templates select="child::node()" />
}
</xsl:template>
<xsl:template match="/*/*">
public static String <xsl:value-of select="name()" />;
public static String get<xsl:value-of select="name()" /> {
return <xsl:value-of select=" name()" />;
}
public void static set<xsl:value-of select="name()" />(String value) {
<xsl:value-of select="name()" /> = value;
}
</xsl:template>
</xsl:stylesheet>
Если вы обработаете с помощью этого примера XML:
<?xml version="1.0" encoding="UTF-8"?>
<Human>
<EyeColor>brown</EyeColor>
<HairColor>brown</HairColor>
</Human>
Вы получите что-то вроде: открытый класс Человек {
public static String EyeColor;
public static String getEyeColor {
return EyeColor;
}
public static void setEyeColor(String value) {
this.EyeColor = value;
}
public static String HairColor;
public static String getHairColor {
return HairColor;
}
public static void setHairColor(String value) {
this.HairColor = value;
}
}
Взгляните на XDoclet . Это расширяемый механизм генерации открытого исходного кода для Java.
РЕДАКТИРОВАТЬ: Как указывает Божо, XDoclet в основном заменен аннотациями: Аннотации против XDoclet
Используют ли какие-либо библиотеки Java аннотации для генерации кода?
Вы можете взглянуть на модель проекта моделирования Eclipse для текстовых компонентов .
Well Eclipse Modeling Framework (EMF) предназначена для приложения, которое вы с нетерпением ждете. Я предполагаю, что у вас есть модель, и вы хотите преобразовать ее в код. Я могу дать очень конкретный совет: JET (шаблон Java Emitter), вы можете найти здесь более подробную информацию.
Также более новый фреймворк XP и представленный eclipse,
Вращаются вокруг абстрактных компонентов разработки синтаксиса, технологии преобразования модели. Технологии. 1. преобразование модели в текст (шаблоны эмиттера Java [JET] и Xpand) 2. Модель-модель (QVT и ATL)
Здесь модель относится к модели XML-XSLT / UML (Rational rose).
От XML к JAVA и наоборот Я очень рекомендую JAXB.
Вы можете генерировать исходный код Java из схем, используя JAXB 2.0 или выше. Или вы можете генерировать схемы из Java.
Вы также можете легко заставить JAXB генерировать/потреблять JSON с помощью Jettison.
Вы также можете заставить JAXB генерировать POJO в стиле Martin Fowler Fluent Style или множеством различных способов, используя его систему плагинов.
EDIT на основе ваших комментариев: Пусть XSLT сгенерирует ваш JAXB POJO:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:template match="/" priority="100">
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="Human")
public class <xsl:value-of select="name(node())" /> {
<xsl:apply-templates select="child::node()" />
}
</xsl:template>
<xsl:template match="/*/*">
private String <xsl:value-of select="name()" />;
public String get<xsl:value-of select="name()" /> {
return <xsl:value-of select=" name()" />;
}
public void set<xsl:value-of select="name()" />(String value) {
this.<xsl:value-of select="name()" /> = value;
}
</xsl:template>
</xsl:stylesheet>
Если вы обработаете этот пример XML:
<?xml version="1.0" encoding="UTF-8"?>
<Human>
<EyeColor>brown</EyeColor>
<HairColor>brown</HairColor>
</Human>
Вы получите что-то вроде:
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="Human")
public class Human {
private String EyeColor;
public String getEyeColor {
return EyeColor;
}
public void setEyeColor(String value) {
this.EyeColor = value;
}
private String HairColor;
public String getHairColor {
return HairColor;
}
public void setHairColor(String value) {
this.HairColor = value;
}
}
Я делаю это так, что у меня есть XSLT-файл, который просто преобразует мои xml-данные (в моем случае спецификацию протокола) в исходный код Java. Это XSLT-преобразование может быть легко выполнено в ANT-задаче, которая может быть включена в цепочку сборки в eclipse.
Возможно, есть плагин для этой конкретной задачи.
Некоторые полезные ссылки:
Да, вы можете сделать это с помощью файла xml. Создайте свой собственный шаблон файла xml, а затем с помощью команды "Preferences-java-code template-import" выберите этот файл, и вы сможете использовать этот шаблон.