生成代码的代码 之 POJO生成器
我们在写Java代码时候,有时候需要写一些POJO类,也就是只有一些属性和get, set方法的类。例如,在写REST 服务时候,利用Jersery + Jackson,可以把输入的JSON字符串自动转换成一个POJO类,也可以自动把POJO类转换成JSON字符串而输出。在这样的情况下,我们往往需要写很多的POJO类,里面包含多个属性和对应的get, set方法,写起来比较麻烦。那么,我们有办法能很快的写出这些POJO类吗。
实际上,这些POJO类的实质就是一个类名和几个属性的类型和名称。既然如此,我们可以只提供这几个信息,而通过一个程序来把这些POJO类生成出来。所以,我们要做的是一个生成代码的代码,用来生成POJO对象。
要做这件事情,可以用各种编程语言来实现。笔者个人偏好JavaScript,而且JavaScript里面的object model比较适合做这件事,因此这里笔者通过Node.js来实现。代码如下,回头会把代码开源到GitHub.
用法为, 把POJO的定义写到schema.js文件中,然后运行node createpojo.js
// createpojo.js
var fs = require('fs');
var schema = require("./schema")
var defaultindent = 2;
var getIndent = function(i) {
return getIndentCore(i, 0);
};
var getIndentCore = function(len, i) {
if (i >= len) {
return "";
}
return getIndentCore(len, i+1) + " ";
};
var createField = function(field, indentsize) {
var i = indentsize == undefined ? 2 : indentsize;
return getIndent(i) + "private " + field.type + " " + field.name + ";";
};
var createFields = function(fields, indentsize) {
var fieldsstring = fields.map(function(f) {
return createField(f, indentsize);
});
return fieldsstring.join("\n");
};
var createEmptyConstructor = function(clz, indentsize) {
return getIndent(indentsize) + "public " + clz + "() {\n\n" + getIndent(indentsize) + "}";
};
var createVariable = function(f) {
return f.type + " " + f.name;
};
var createArglist = function(fields) {
var args = fields.map(createVariable);
return args.join(", ");
};
var createAssign = function(field, indentsize) {
return getIndent(indentsize) + "this." + field.name + " = " + field.name + ";";
};
var createAssigns = function(fields, indentsize) {
var assigns = fields.map(function(f) {
return createAssign(f, indentsize);
});
return assigns.join("\n");
};
var createConstructor = function(clz, fields, indentsize) {
return getIndent(indentsize) + "public " + clz + "(" + createArglist(fields) + ") {\n" + createAssigns(fields, indentsize + defaultindent) + "\n" + getIndent(indentsize) + "}";
};
var createConstructors = function(clz, fields, indentsize) {
return createEmptyConstructor(clz, indentsize) + "\n\n" + createConstructor(clz, fields, indentsize);
};
var getFuncName = function(name) {
return name.substring(0,1).toUpperCase() + name.substring(1);
};
var createSetter = function(field, indentsize) {
var line1 = getIndent(indentsize) + "public void set" + getFuncName(field.name) + "(" + createVariable(field) + ") {";
var line2 = createAssign(field, indentsize + defaultindent);
var line3 = getIndent(indentsize) + "}";
var lines = [line1, line2, line3];
return lines.join("\n");
};
var createGetter = function(field, indentsize) {
var line1 = getIndent(indentsize) + "public " + field.type + " get" + getFuncName(field.name) + "() {";
var line2 = getIndent(indentsize + defaultindent) + "return this." + field.name + ";";
var line3 = getIndent(indentsize) + "}";
var lines = [line1, line2, line3];
return lines.join("\n");
};
var createAccessor = function(field, indentsize) {
var access = [createSetter(field, indentsize), createGetter(field, indentsize)];
return access.join("\n");
};
var createAccessors = function(fields, indentsize) {
var accesses = fields.map(function(f) {return createAccessor(f, indentsize);});
return accesses.join("\n\n");
};
var createClass = function(pkg, clz, fields) {
var line1 = "package " + pkg + ";";
var line2 = "public class " + clz + " {";
var line3 = createFields(fields, defaultindent);
var line4 = createConstructors(clz, fields, defaultindent);
var line5 = createAccessors(fields, defaultindent);
var line6 = "}";
var lines = [line1, line2, line3, line4, line5, line6];
return lines.join("\n\n");
};
var classcontents = schema.map(function(s) {
return createClass(s["package"], s["name"], s["fields"]);
});
for (var i = 0; i < schema.length; i++) {
fs.writeFile(schema[i].name + ".java", classcontents[i], function(e){
if (e) {
console.log("error: " + e);
}
});
}
// schema.js
var schemas = [
{
"name": "TestClass",
"package": "example.com",
"fields": [
{"name": "name", "type": "String"},
{"name": "value", "type": "String"}
]
}
]
module.exports = schemas;
代码只是用来做工具用,所以没有写的很完善。如果读者觉得代码有改进之处,欢迎在代码开源之后提交更新。
生成代码的代码 之 POJO生成器的更多相关文章
- 生成代码的代码 之 POJO生成器 之二 模板实现
在之前的一篇博客中,我们写了利用node.js来生成JAVA的POJO代码的方法.有评论说可以利用模板来做这件事.当时认为模板只能做简单的字符串替换,所以可能无法完成任务.但是,仔细的学习了一个模板 ...
- 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代码, ...
随机推荐
- springboot 配置DRUID数据源
druid 是阿里开源的数据库连接池. 开发时整合 druid 数据源过程. 1.修改pom.xml <dependency> <groupId>mysql</gro ...
- 第20章:MongoDB-聚合操作--聚合管道--$unwind
①$unwind 在查询数据的时候经常会返回数组信息,但是数组并不方便信息的浏览,所以提供有“$unwind”可以将数组数据变为独立的字符串内容. 将文档中数组类型的字段拆分成多条,每条文档包含数组中 ...
- 怎么让挨着的两input之间没有空隙?
问题:在写选项卡的时候,用input做点击事件的切换时,两个input之间会有空隙,使用margin/padding为0或者为负数依旧如此 → 解决:我脑慢的最后才想到是空格影响的,呵呵呵.
- Atcoder Grand-014 Writeup
A - Cookie Exchanges 题面 Takahashi, Aoki and Snuke love cookies. They have A, B and C cookies, respec ...
- ArcGIS API for Silverlight部署本地地图服务
这一节我们来讲新建立的ArcGIS API for Silverlight应用程序如何加载自己的地图服务的问题,网上的资料讲的都有点含糊不清,这次我们详细的讲一下配置的步骤: 首先介绍下我们的开发和部 ...
- SED单行脚本快速参考(Unix 流编辑器)
------------------------------------------------------------------------- SED单行脚本快速参考(Unix 流编辑器) 200 ...
- ubuntu下mysql远程连接
第一步: vim /etc/mysql/my.cnf找到bind-address = 127.0.0.1 注释掉这行,如:#bind-address = 127.0.0.1 ...
- noip第7课资料
- noip第29课作业
1. 钢条切割 [问题描述] 一家公司购买长钢条,将其切割成短钢条出售,切割本身没有成本,长度为i的短钢条的价格为Pi.那给定一段长度为n的钢条和一个价格表Pi,求钢条的切割方案使得收益Rn最大. ...
- noip第16课作业
1. 猴子吃桃 [问题描述] 猴子第一天摘了若干个桃子,当即吃了一半,还不解馋,又多吃了一个:第二天,吃剩下的桃子的一半,还不过瘾,又多吃了一个:以后每天都吃前一天剩下的一半多一个,到第10天想再吃时 ...