生成代码的代码 之 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;
}
}
采用模板的好处是,如果我们需要对最终生成的类定义做修改,只要不是很复杂的修改,直接改模板就可以,很方便。
生成代码的代码 之 POJO生成器 之二 模板实现的更多相关文章
- 生成代码的代码 之 POJO生成器
我们在写Java代码时候,有时候需要写一些POJO类,也就是只有一些属性和get, set方法的类.例如,在写REST 服务时候,利用Jersery + Jackson,可以把输入的JSON字符串自动 ...
- mybatis自定义代码生成器(Generator)——自动生成model&dao代码
花了两天的时间研究了下mybatis的generator大体了解了其生成原理以及实现过程.感觉generator做的非常不错,给开发者也留足了空间.看完之后在generator的基础上实现了自定义的生 ...
- SNF开发平台-SNF.CodeGenerator-升级生成BS页面代码-支持视图-数据库配置-快速开发者的利器
有一段时间没有进行总结SNF快速开发平台了,这段时间把今年在框架升级部分进行整理说明. 下面就把代码生成器升级部分介绍一下: 1.新增BS页面生成代码 2.新增视图支持 3.新增 数据库配置 1.新增 ...
- JSON生成c#类代码小工具
JSON生成c#类代码小工具 为什么写这么个玩意 最近的项目中需要和一个服务端程序通讯,而通讯的协议是基于流行的json,由于是.net,所以很简单的从公司代码库里找到了Newtonsoft.dll( ...
- 分享:根据webservice WSDL地址自动生成java调用代码及JAR包
分享:根据webservice WSDL地址自动生成java调用代码及JAR包使用步骤:一.安装java 并配置JAVA_HOME 及 path二.安装ANT 并配置ANT_HOME三.解压WsdlT ...
- 命令行方式使用abator.jar生成ibatis相关代码和sql语句xml文件
最近接手一个老项目,使用的是数据库是sql server 2008,框架是springmvc + spring + ibatis,老项目是使用abator插件生成的相关代码,现在需要增加新功能,要添加 ...
- MATLAB Coder从MATLAB生成C/C++代码步骤
MATLAB Coder可以从MATLAB代码生成独立的.可读性强.可移植的C/C++代码. 使用MATLAB Coder产生代码的3个步骤: 准备用于产生代码的MATLAB算法: 检查MATLAB代 ...
- soupUI生成webservice客户端代码
在Apache网站下载axis2软件包,同时本机安装soapUI工具.例如,当前我使用的axis2版本为axis2-1.4-bin.zip,soapUI版本为3.6. Apache Axis下载地址: ...
- 如何通过VIM把代码格式化后生成HTML网页代码
本文转自http://wangxiaoyu.blog.51cto.com/922065/203471 需求及思路:演示需要,需要网站上嵌入一些代码,我的建议做法是根据代码文件,生成相应的HTML代码, ...
随机推荐
- layer 弹框不显示内容
// layer的弹框不显示信息 可能是背景颜色和字体颜色冲突 改下字体颜色即可 layer.msg('<p style="color:black">用户名不能为空&l ...
- java常用设计模式八:代理模式
一.概述 代理模式是指客户端并不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象. 其特征是代理类与委托类有同样的接口,真正的核心业务逻辑还是在实际对象里面. 二.为什么要使用代理模式 当 ...
- 第04章:MongoDB基本概念
① 数据库 MongoDB的一个实例可以拥有一个或多个相互独立的数据库,每个数据库都有自己的集合 集合 集合可以看作是拥有动态模式的表 文档 文档是MongoDB中基本的数据单元,类似于RDB ...
- GDAL读写矢量文件——Python
在Python中使用OGR时,先要导入OGR库,如果需要对中文的支持,还需要导入GDAL库,具体代码如下.Python创建的shp结果如图1所示. 图1 Python创建矢量结果 #-*- codin ...
- Ng第八课:神经网络表述(Neural Networks: Representation)
8.1 非线性假设 8.2 神经元和大脑 8.3 模型表示 1 8.4 模型表示 2 8.5 特征和直观理解 1 8.6 样本和直观理解 II 8.7 多类分类 8.1 非线性假设 无 ...
- MyBatis高级篇之整合ehcache缓存框架
MyBatis高级篇之整合ehcache缓存框架 2017-09-01 0 Comments 1,671 Views 0 Times 一.前言 MyBatis为我们提供了Cache接口,也提供 ...
- 最大m段子段和
hdu1024 最大m子序列和 给定你一个序列,让你求取m个子段(不想交的子段)并求取这m个子段和的最大值 从二维开始来看dp[i][j]表示取第j个数作为第i个子段的元素所得到的前i个子段和的最大值 ...
- D3_book 11.2 stack
<!-- book :interactive data visualization for the web 11.2 stack 一个堆叠图的例子 --> <!DOCTYPE htm ...
- 七种bond模式说明
第一种模式:mod=0 ,即:(balance-rr) Round-robin policy(平衡抡循环策略) 特点:传输数据包顺序是依次传输(即:第1个包走eth0,下一个包就走eth1….一直循环 ...
- Android-Kotlin-递归与尾递归
递归: 阶乘计算: /** * 阶乘: * 1的阶乘是1,因为1往下走一个楼梯 就是0了 * 2的阶乘是 2*1 * 3的继承是 3*2*1 * 4的继承是 4*3*2*1 * 5的阶乘是 5*4*2 ...