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

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

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

首先是模板

  1. // ClassTemplate.java
  2. package {{package}};
  3. public class {{name}} {
  4. {{#fields}}
  5. private {{type}} {{name}};
  6. {{/fields}}
  7. public {{name}}() {
  8. }
  9. public {{name}}({{#compose fields}}{{type}} {{name}}{{/compose}}) {
  10. {{#fields}}
  11. this.{{name}} = {{name}};
  12. {{/fields}}
  13. }
  14. {{#fields}}
  15. public void set{{#uppercase}}{{name}}{{/uppercase}}({{type}} {{name}}) {
  16. this.{{name}} = {{name}};
  17. }
  18. public {{type}} get{{#uppercase}}{{name}}{{/uppercase}}() {
  19. return this.{{name}};
  20. }
  21. {{/fields}}
  22. }

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

  1. // createpojo.js
  2. var handlebars = require('handlebars');
  3. var fs = require('fs');
  4. var schema = require("./schema")
  5. var templatefile = "ClassTemplate.java";
  6. handlebars.registerHelper('uppercase', function(options) {
  7. var name = options.fn(this);
  8. var result = name.substring(0,1).toUpperCase() + name.substring(1);
  9. return new handlebars.SafeString(result);
  10. });
  11. handlebars.registerHelper('compose', function(items, options) {
  12. var assigns = items.map(function(i) {return options.fn(i);});
  13. var result = assigns.join(", ");
  14. return new handlebars.SafeString(result);
  15. });
  16. var source = fs.readFileSync(templatefile, "utf8");
  17. var template = handlebars.compile(source);
  18. schema.forEach(function(s) {
  19. var result = template(s);
  20. fs.writeFile(s.name + ".java", result, function(e){
  21. if (e) {
  22. console.log("error: " + s.name + " : " + e);
  23. }
  24. });
  25. });

最后是个简单的数据文件

  1. // schema.js
  2. var schemas = [
  3. {
  4. "name": "TestClass",
  5. "package": "com.example",
  6. "fields": [
  7. {"name": "name", "type": "String"},
  8. {"name": "age", "type": "int"}
  9. ]
  10. }
  11. ]
  12. module.exports = schemas;

运行如下命令

  1. node createpojo.js

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

  1. // TestClass.java
  2. package com.example;
  3. public class TestClass {
  4. private String name;
  5. private int age;
  6. public TestClass() {
  7. }
  8. public TestClass(String name, int age) {
  9. this.name = name;
  10. this.age = age;
  11. }
  12. public void setName(String name) {
  13. this.name = name;
  14. }
  15. public String getName() {
  16. return this.name;
  17. }
  18. public void setAge(int age) {
  19. this.age = age;
  20. }
  21. public int getAge() {
  22. return this.age;
  23. }
  24. }

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

生成代码的代码 之 POJO生成器 之二 模板实现的更多相关文章

  1. 生成代码的代码 之 POJO生成器

    我们在写Java代码时候,有时候需要写一些POJO类,也就是只有一些属性和get, set方法的类.例如,在写REST 服务时候,利用Jersery + Jackson,可以把输入的JSON字符串自动 ...

  2. mybatis自定义代码生成器(Generator)——自动生成model&dao代码

    花了两天的时间研究了下mybatis的generator大体了解了其生成原理以及实现过程.感觉generator做的非常不错,给开发者也留足了空间.看完之后在generator的基础上实现了自定义的生 ...

  3. SNF开发平台-SNF.CodeGenerator-升级生成BS页面代码-支持视图-数据库配置-快速开发者的利器

    有一段时间没有进行总结SNF快速开发平台了,这段时间把今年在框架升级部分进行整理说明. 下面就把代码生成器升级部分介绍一下: 1.新增BS页面生成代码 2.新增视图支持 3.新增 数据库配置 1.新增 ...

  4. JSON生成c#类代码小工具

    JSON生成c#类代码小工具 为什么写这么个玩意 最近的项目中需要和一个服务端程序通讯,而通讯的协议是基于流行的json,由于是.net,所以很简单的从公司代码库里找到了Newtonsoft.dll( ...

  5. 分享:根据webservice WSDL地址自动生成java调用代码及JAR包

    分享:根据webservice WSDL地址自动生成java调用代码及JAR包使用步骤:一.安装java 并配置JAVA_HOME 及 path二.安装ANT 并配置ANT_HOME三.解压WsdlT ...

  6. 命令行方式使用abator.jar生成ibatis相关代码和sql语句xml文件

    最近接手一个老项目,使用的是数据库是sql server 2008,框架是springmvc + spring + ibatis,老项目是使用abator插件生成的相关代码,现在需要增加新功能,要添加 ...

  7. MATLAB Coder从MATLAB生成C/C++代码步骤

    MATLAB Coder可以从MATLAB代码生成独立的.可读性强.可移植的C/C++代码. 使用MATLAB Coder产生代码的3个步骤: 准备用于产生代码的MATLAB算法: 检查MATLAB代 ...

  8. soupUI生成webservice客户端代码

    在Apache网站下载axis2软件包,同时本机安装soapUI工具.例如,当前我使用的axis2版本为axis2-1.4-bin.zip,soapUI版本为3.6. Apache Axis下载地址: ...

  9. 如何通过VIM把代码格式化后生成HTML网页代码

    本文转自http://wangxiaoyu.blog.51cto.com/922065/203471 需求及思路:演示需要,需要网站上嵌入一些代码,我的建议做法是根据代码文件,生成相应的HTML代码, ...

随机推荐

  1. 纯css实现蒙层loading效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. pat1079+1086+1090+1094(树的遍历)感想

    今天做了这4道题,虽然大部分以前做过,但还是有些知识掌握不全. 总结一下所用的树的知识及解决方法 (1)非二叉树的遍历: 非二叉树就是图,所以它的存储结构类似邻接表,c++提供了vector数组可以很 ...

  3. Java数组的初始化

    1.动态初始化 数据类型 [] 变量名 = new 数据类型 [数组大小]; //数组的动态初始化 int [] arr = new int [3]; 2.静态初始化 数据类型 [] 变量名 = {元 ...

  4. c#编程模仿的1stopt界面

    * Levenberg-Marquardt法 (LM)+ 通用全局优化算法(Universal Global Optimization - UGO) * Quasi-Newton法 (BFGS)+ 通 ...

  5. Gibs抽样

    /* * Copyright (C) 2007 by * * Xuan-Hieu Phan * hieuxuan@ecei.tohoku.ac.jp or pxhieu@gmail.com * Gra ...

  6. jquery的call()和apply()方法

    call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call 方法可以用来 ...

  7. [指南] 15分钟学会MySQL(Linux版)

    原文链接:http://www.mysqlpub.com/thread-348-1-1.html 原创出处:MySQLpub.com  , 作者:kider  ,转载请注明作者和出处,并不能用于商业用 ...

  8. Memory Allocation Error

    Memory allocation error happened when I tried to install MySQL 5.7.13 in my server, which has 2G mem ...

  9. (CodeForces 548B 暴力) Mike and Fun

    http://codeforces.com/problemset/problem/548/B Mike and some bears are playing a game just for fun. ...

  10. security.php

    <?php /** * */ class Security { public function csrf_verify() { if(count($_POST) == 0) { return ' ...