zoukankan      html  css  js  c++  java
  • 生成代码的代码 之 POJO生成器 之二 模板实现

    之前的一篇博客中,我们写了利用node.js来生成JAVA的POJO代码的方法。有评论说可以利用模板来做这件事。当时认为模板只能做简单的字符串替换,所以可能无法完成任务。但是,仔细的学习了一个模板 -- handlebars -- 之后,发现确实可以对内容做一些简单的修改。所以就用handlebars来重新实现 生成代码的代码 之 POJO生成器。

    对需要生成的内容做点分析后发现,如果利用模板来实现,要生成的POJO类里面有两个地方需要对内容做修改,而不是简单的字符串替换。一个是在产生构造函数时,需要构造一个包含所有类成员变量的输入参数列表,第二是对于get/set函数,需要把变量的首字母大写。而handlebars提供了block helper,可以对内容做修改。所以,整体思路就是,定义两个block helper来对这两处做简单的内容修改,其他地方直接用模板。

    最终的代码如下。可以看到,比上次的代码清晰多了。所以模板确实是个很好用的东西。

    首先是模板

    // ClassTemplate.java
    package {{package}};
    
    public class {{name}} {
    
      {{#fields}}
      private {{type}} {{name}};
      {{/fields}}
    
      public {{name}}() {
    
      }
    
      public {{name}}({{#compose fields}}{{type}} {{name}}{{/compose}}) {
        {{#fields}}
        this.{{name}} = {{name}};
        {{/fields}}
      }
    
      {{#fields}}
      public void set{{#uppercase}}{{name}}{{/uppercase}}({{type}} {{name}}) {
        this.{{name}} = {{name}};
      }
      public {{type}} get{{#uppercase}}{{name}}{{/uppercase}}() {
        return this.{{name}};
      }
    
      {{/fields}}
    
    }
    

    接下来是利用模板生成POJO类的node.js代码

    // createpojo.js
    var handlebars = require('handlebars');
    var fs = require('fs');
    var schema = require("./schema")
    
    var templatefile = "ClassTemplate.java";
    
    handlebars.registerHelper('uppercase', function(options) {
      var name = options.fn(this);
      var result = name.substring(0,1).toUpperCase() + name.substring(1);
      return new handlebars.SafeString(result);
    });
    
    handlebars.registerHelper('compose', function(items, options) {
      var assigns = items.map(function(i) {return options.fn(i);});
      var result = assigns.join(", ");
      return new handlebars.SafeString(result);
    });
    
    var source = fs.readFileSync(templatefile, "utf8");
    var template = handlebars.compile(source);
    
    schema.forEach(function(s) {
      var result = template(s);
      fs.writeFile(s.name + ".java", result, function(e){
        if (e) {
          console.log("error: " + s.name + " : " + e);
        }
      });
    });
    

    最后是个简单的数据文件

    // schema.js
    var schemas = [
      {
        "name": "TestClass",
        "package": "com.example",
        "fields": [
          {"name": "name", "type": "String"},
          {"name": "age", "type": "int"}
        ]
      }
    ]
    
    module.exports = schemas;
    

    运行如下命令

    node createpojo.js
    

    之后,就可以得到TestClass的定义文件。如果在schema.js里面写多个类定义数据,这里就可以得到多个文件。每个类的定义对应一个文件。

    // TestClass.java
    package com.example;
    
    public class TestClass {
    
      private String name;
      private int age;
    
      public TestClass() {
    
      }
    
      public TestClass(String name, int age) {
        this.name = name;
        this.age = age;
      }
    
      public void setName(String name) {
        this.name = name;
      }
      public String getName() {
        return this.name;
      }
    
      public void setAge(int age) {
        this.age = age;
      }
      public int getAge() {
        return this.age;
      }
    
    
    }
    

    采用模板的好处是,如果我们需要对最终生成的类定义做修改,只要不是很复杂的修改,直接改模板就可以,很方便。

  • 相关阅读:
    构建之法阅读笔记02
    NOPI2018 货币系统 bool完全背包 bitset优化转移
    P4551 最长异或路径 Trie经典应用 bitset应用
    算法分析与设计实验报告 Project2
    ARC-114 C- Sequence Scores 计数
    P2401 不等数列 简单计数DP
    Gym-102569C Manhattan Distance 曼哈顿距离的转换 二分
    GYM-102893J Straight 模拟 思维
    算法分析与设计实验报告 Project1
    CodeForces Round 705-D GCD of an Array 数论 乱搞 or 线段树 + 质因子分解科技
  • 原文地址:https://www.cnblogs.com/l00l/p/4652689.html
Copyright © 2011-2022 走看看