在Eclipse中生成java代码?

时间:2010-06-02 17:44:48

标签: java android eclipse code-generation

有人知道在eclipse中自动生成Java源代码的方法,例如xml或json文件吗?

我正在考虑做的一个很好的例子是Google Android sdk所做的事情:他们有一个从resources自动生成的R类。

每次在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

谢谢!

7 个答案:

答案 0 :(得分:4)

我这样做是因为我有一个XSLT文件,它只是将我的xml数据(在我的情况下是一个协议规范)转换为java源代码。这个XSLT转换可以很容易地在一个ANT任务中完成,该任务可以包含在eclipse的构建链中。

也许这个特定任务有一个插件。

一些有用的链接:

答案 1 :(得分:3)

我根据您的评论添加了另一个答案,也因为我不建议您在Google Android Resource SDK之外执行此操作。 Google基本上使用静态类(单例)的层次结构来获取其资源。 您需要使XSLT生成静态成员变量而不是getter和setter。

我基本上接受了我的旧答案,并将其更改为所有成员变量的静态。 你必须非常小心这样做,因为我看到了很多错误,错误地使用了“静态”修饰符。

<?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;
    }


}

答案 2 :(得分:2)

Eclipse Eclipse Modeling Framework(EMF)适用于您期待的应用程序。 我假设你有一个模型,你想将其转换为代码。我可以给出的非常具体的提示是JET(Java Emitter模板),您可以在这里查看更多详细信息。

也是由eclipse引入的新框架XP,

围绕抽象语法开发组件进行转换是模型转换技术 - nologies。 1.模型到文本(Java Emitter Templates [JET]和Xpand) 2.模型到模型(QVT和ATL)

这里的模型是指XML-XSLT / UML(Rational rose)模型。

答案 3 :(得分:1)

看看XDoclet。它是一个可扩展的Java开源代码生成引擎。

编辑:正如bozho指出的那样,XDoclet大部分都被注释取代:Annotations vs. XDoclet

Do any java libraries use annotations for code generation?

答案 4 :(得分:1)

从XML到JAVA和副Versa我强烈推荐JAXB。

您可以使用JAXB 2.0或更高版本从Schema生成Java源代码。 或者您可以从Java生成Schema。

您还可以使用Jettison轻松地使JAXB生成/使用JSON。

你也可以让JAXB使用其插件系统以Martin Fowler Fluent Style或一系列不同的方式生成POJO。

根据您的评论编辑: 让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;
    }


}

答案 5 :(得分:1)

您可以查看Eclipse建模项目的model to text components

答案 6 :(得分:0)

是的,您可以使用xml文件来创建它。创建您自己的xml文件模板,然后使用preferences-java-code template-import选择该文件,您可以使用该模板。