【问题标题】:Generate java code in Eclipse?在 Eclipse 中生成 java 代码?
【发布时间】:2011-02-26 22:57:10
【问题描述】:

有谁知道在 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

谢谢!

【问题讨论】:

  • 别忘了,在 Android 的情况下,您可以下载 SDK 和整个平台的源代码并检查他们是如何做到的 (android.git.kernel.org)
  • 谢谢,但它太大了,我不知道从哪里开始!
  • 你只是在做数据对象(很少或没有行为)吗?如果你是,你应该使用 JAXB。看我的回答。
  • 您使用“R.tags.ids.ALPHA”提供的示例不是 Java,或者 Google 的 Android SDK 使他们的 Java 类具有公共成员访问权限,这在 Java 社区中是一些规避的。很容易更新我提供的 XSLT 来执行这种非规范行为。
  • 我并不真正担心约定,我只是希望生成的代码可用。谢谢:)

标签: java android eclipse code-generation


【解决方案1】:

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

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

一些有用的链接:

【讨论】:

    【解决方案2】:

    我正在根据您的 cmets 添加另一个答案,而且我真的不建议在 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;
        }
    
    
    }
    

    【讨论】:

    • 如果它是公开的,为什么我还需要 getter-setter 方法?为什么不是一般的 Final 静态成员?
    • 因为如果您想使用自动读取和填充字段的序列化工具(如 JAXB),就需要它们。否则你不需要它们。事实上,有些工具允许您使用成员变量而不是 getter/setter。
    • 有没有办法在 Eclipse 中将其连接起来,例如,每当我保存 xml 文件时,它就会自动关闭?
    【解决方案3】:

    那么 Eclipse 建模框架 (EMF) 适用于您期待的应用程序。 我假设您有一个模型,并且您想将其转换为代码。我可以给出的非常具体的提示是JET(Java Emitter 模板),您可以参考此处了解更多详细信息。

    也是eclipse引入的较新的框架XP和,

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

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

    【讨论】:

    • 我找不到“XPand”框架。能给个链接吗?
    【解决方案4】:

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

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

    Do any java libraries use annotations for code generation?

    【讨论】:

    • 注释使 XDoclet 不再需要。它在 1.5 之前的时代非常强大,但现在不是了。
    • 请注意我不想从我的代码中生成 xml;我想从 xml 或 json 生成代码。
    • @drozzy 您可以使用 xdoclet 和注释生成代码
    • @drozzy 您可以将您的 xml 配置转换为带注释的源代码,类似于您可以将 hibernate 或 spring xml 配置文件替换为注释的方式。
    • 太好了,我不熟悉hibernate或spring。您能否提供一些资源来说明从 text/xml 文件生成带注释的源代码的起点?
    【解决方案5】:

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

    【讨论】:

    • 谢谢,但首先我不知道它到底是做什么的。似乎它将java代码转换为文本,而我需要它的另一种方式 - 给定文本(xml或json)创建一个java类,其值在文本文件中给出。
    • @drozzy 第一步是通过解析输入格式来获得某种模型,例如您可以使用 JDOM 解析您的 XML,然后使用 JET 生成 Java 源文件(请参阅eclipse.org/articles/Article-JET/jet_tutorial1.html)。另一种选择是将 XML 与 EMF 结合使用,并使用 Xpand 从 EMF 模型 (openarchitectureware.org/pub/documentation/4.3.1/html/contents/…) 生成 Java 文件。
    • 谢谢,但是 JET 教程对于 JET 到底是做什么的并不是很清楚。还有什么是 EMF?
    • 使用 JET,您可以为要生成的代码定义一个模板。从此,JET 将生成一个类,该类将创建您的代码,允许您将模型传递给该类。 EMF 是 Eclipse 建模框架:eclipse.org/modeling/emf
    【解决方案6】:

    从 XML 到 JAVA,反之亦然,我强烈推荐 JAXB。

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

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

    您还可以让 JAXB 以 Martin Fowler Fluent 风格或使用其插件系统的多种不同方式生成 POJO。

    根据您的 cmets 进行编辑: 让 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;
        }
    
    
    }
    

    【讨论】:

    • 谢谢,但我不仅对 Xml 文档的架构感兴趣,而且对其中包含的实际数据感兴趣。因此,如果我的 xml 文档具有给定名称的属性,我希望在 java 类文件中创建相同的属性。我希望我能说得通。
    • 是的,但编写 XSLT 工作表来创建具有正确 JAXB 注释的 Java 类并不难
    • @drozzy:添加了一个 XSLT 示例
    • 谢谢亚当,但我怎么能从上面得到价值(棕色)?例如。 Human.EyeColor.brown 还是 Human.HairColor.brown?你懂我的意思吗?这就是 Android 对他们的 R 类所做的事情,例如:R.values.brown 等...
    【解决方案7】:

    是的,您可以使用 xml 文件来完成。创建您自己的 xml 文件模板,然后使用首选项-java-code 模板-导入选择该文件,您就可以使用该模板。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-07
      • 2011-05-14
      • 1970-01-01
      • 2012-10-18
      • 1970-01-01
      • 2015-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多