【问题标题】:Template- and manifest-based Code Generation for JavaJava 的基于模板和清单的代码生成
【发布时间】:2014-05-09 22:44:58
【问题描述】:

我正在构建一个基于插件的应用程序。插件通过共享消息总线进行通信。出于几个明显的原因,包括保证类型安全,我最终编写了类似这样的代码:

public class OtherPluginController {
    ...
    public void doSomething(int intParam, String stringParam) {
        Command cmd = new Command();
        cmd.target = "OtherPlugin";
        cmd.name = "doSomething";
        cmd.params.put("intParam", intParam);
        cmd.params.put("stringParam", stringParam);

        MessageBus.emit(cmd);
    }
    ...
}

为了可扩展性和可维护性,现在从某种清单文件创建这些控制器会很棒,例如上面的示例,并使用 XML,类似

<Plugin name="OtherPlugin">
    ...
    <Command name="doSomething">
        <Parameter name="intParam" type="int"/>
        <Parameter name="stringParam" type="String"/>
    </Command>
    ...
</Plugin>

尽管有很多基于模板的框架,但它们中的大多数似乎都针对不同的用例。有没有我错过的框架?如果没有,是否有一个我至少可以滥用这种事情的框架?

【问题讨论】:

  • 您是否尝试过protobuf 来定义您的消息?
  • protobuf 是一个序列化问题的框架。即使我想在消息总线上使用序列化字节流而不是 POJO,protobuf 也无法帮助我解决手动将方法名称和参数分配给消息对象的问题。
  • protobuf 包含一个代码生成器,可以为您编写消息 POJO。
  • 明确一点:我不想自动生成第一个sn-p中显示的Command对象的不同版本,我想自己生成第一个代码sn-p。在我看来,protobuf 做不到。
  • 您可以使用 Xtext 编写自己的代码生成器。 eclipse.org/Xtext/documentation.html#TutorialCodeGeneration 。看一看。也许它符合您的需求。

标签: java code-generation


【解决方案1】:

经过一些额外的研究,我发现,如果“清单”以 XML 形式提供,那么最好和最简单的方法似乎是 XSLT。给定这样的清单文件:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="PluginControllerTemplate.xsl"?>
<Plugin name="OtherPlugin">
    <Command name="doSomething">
        <Parameter name="intParam" type="int"/>
        <Parameter name="stringParam" type="String"/>
    </Command>
    <Command name="doSomethingElse"/>
</Plugin>

还有一个像这样的 XSL 文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:output method="text"/>
    <xsl:preserve-space elements="*"/>
    <xsl:template match="Plugin" xml:space="preserve">
public class <xsl:value-of select="@name"/>Controller {
        <xsl:for-each select="Command">
    public void <xsl:value-of select="@name"/>(<xsl:for-each select="Parameter"><xsl:value-of select="@type"/> <xsl:value-of select="@name"/><xsl:if test="position() != last()">, </xsl:if></xsl:for-each>) {

    }       
        </xsl:for-each>
}
    </xsl:template>
</xsl:stylesheet>

输出将是

public class OtherPluginController {

    public void doSomething(int intParam, String stringParam) {

    }

    public void doSomethingElse() {

    }

}

使用 XSLT 的主要优点是,您无需为定义语言定义自己的语法和/或解析器,而且由于它适用于任何浏览器,因此无需任何额外设置即可使用。但是,如果您希望将代码生成作为 IDE 的一部分,仍然可以将 XSLT 集成到 Eclipse 中。

【讨论】:

    猜你喜欢
    • 2016-02-01
    • 2012-08-20
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多