Создать 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).

Ответ 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;
    }


}

Ответ 7

Да, вы можете сделать это с помощью xml файла. Создайте свой собственный шаблон XML файла, а затем с помощью preferences-java-code template-import выберите этот файл, и вы можете использовать этот шаблон.