Создать Java-код в Eclipse?
Кто-нибудь знает, какой подход можно предпринять, чтобы автоматически генерировать исходный код Java, например, из файла xml или json, в eclipse?
Один замечательный пример того, что я собираюсь сделать, - это то, что делает Android-устройство Google Android: у них есть класс R, сгенерированный автоматически из resources.
Каждый раз, когда файл ресурса сохраняется в классе Eclipse R, он автоматически восстанавливается.
ОБНОВЛЕНИЕ: Пример:
В тексте (файл xml или json) у меня есть следующее:
<tags>
<tag id="ALPHA">
<description>The first alpha tag.</description>
<value>231232</value>
</tag>
<tag id="BETA">
<description>This is the beta tag.</description>
<value>231232</value>
</tag>
Тогда в моем сгенерированном классе 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
Спасибо!
Ответы
Ответ 1
Я добавляю еще один ответ, основанный на ваших комментариях, а также потому, что я действительно не рекомендую делать это за пределами Google Android Resource SDK.
Google в основном использует иерархию статических классов (одноточие) для своих ресурсов.
Вам нужно, чтобы ваш XSLT генерировал статические переменные-члены вместо геттеров и сеттеров.
В основном я взял свой старый ответ и изменил его на статический для всех переменных-членов.
Вы должны быть очень осторожны, потому что я видел так много ошибок с неправильным использованием "статического" модификатора.
<?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 class 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;
}
}
Ответ 2
Как я это делаю, у меня есть XSLT файл, который просто преобразует мои xml-данные (в моем случае спецификации протокола) в исходный код Java. Это XSLT-преобразование можно легко выполнить в ANT -task, которая может быть включена в цепочку построения в eclipse.
Возможно, есть плагин для этой конкретной задачи.
Некоторые полезные ссылки:
Ответ 3
Модель Eclipse Modeling Framework (EMF) предназначена для приложения, которое вы ожидаете.
Я предполагаю, что у вас есть модель, и вы хотите преобразовать ее в код. Очень конкретный намек, который я могу дать, это JET (шаблон Java Emitter), который вы можете найти здесь для получения более подробной информации.
Также новая инфраструктура XPand, введенная eclipse,
Революция вокруг абстрактных компонентов синтаксиса-разработки - это моделирование технологий,
гий.
1. model-to-text (Java Emitter Templates [JET] и Xpand)
2. модель-модель (QVT и ATL)
Здесь модель относится к модели XML-XSLT/UML (Rational rose).
Ответ 4
Взгляните на XDoclet. Его расширяемый механизм генерации исходного кода для Java.
EDIT: Как указывает bozho, XDoclet в основном заменяется аннотациями: Аннотации против XDoclet
Используют ли какие-либо java-библиотеки аннотации для генерации кода?
Ответ 5
От XML до JAVA и наоборот Versa Я очень рекомендую JAXB.
Вы можете генерировать исходный код Java из схемы с использованием JAXB 2.0 или выше.
Или вы можете генерировать схемы из Java.
Вы также можете легко заставить JAXB генерировать/потреблять JSON с помощью Jettison.
Вы также можете создать JAXB для создания POJO в свободном стиле Martin Fowler или целую кучу разных способов, используя свою систему плагинов.
EDIT на основе ваших комментариев:
Попросите XSLT создать JJXB 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;
}
}
Ответ 6
Вы могли бы взглянуть на модель проекта моделирования Eclipse для текстовых компонентов.
Ответ 7
Да, вы можете сделать это с помощью xml файла. Создайте свой собственный шаблон XML файла, а затем с помощью preferences-java-code template-import выберите этот файл, и вы можете использовать этот шаблон.