基于模板和清单的Java代码生成

时间:2014-05-08 13:31:36

标签: java code-generation

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

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>

虽然有很多基于模板的框架,但大多数框架似乎都针对不同的用例。我错过了一个框架吗?如果没有,是否有一个框架我至少可以滥用这种东西?

1 个答案:

答案 0 :(得分:0)

经过一些额外的研究后,我发现,如果用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中。