我们在写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

  1. // createpojo.js
  2. var fs = require('fs');
  3. var schema = require("./schema")
  4. var defaultindent = 2;
  5. var getIndent = function(i) {
  6. return getIndentCore(i, 0);
  7. };
  8. var getIndentCore = function(len, i) {
  9. if (i >= len) {
  10. return "";
  11. }
  12. return getIndentCore(len, i+1) + " ";
  13. };
  14. var createField = function(field, indentsize) {
  15. var i = indentsize == undefined ? 2 : indentsize;
  16. return getIndent(i) + "private " + field.type + " " + field.name + ";";
  17. };
  18. var createFields = function(fields, indentsize) {
  19. var fieldsstring = fields.map(function(f) {
  20. return createField(f, indentsize);
  21. });
  22. return fieldsstring.join("\n");
  23. };
  24. var createEmptyConstructor = function(clz, indentsize) {
  25. return getIndent(indentsize) + "public " + clz + "() {\n\n" + getIndent(indentsize) + "}";
  26. };
  27. var createVariable = function(f) {
  28. return f.type + " " + f.name;
  29. };
  30. var createArglist = function(fields) {
  31. var args = fields.map(createVariable);
  32. return args.join(", ");
  33. };
  34. var createAssign = function(field, indentsize) {
  35. return getIndent(indentsize) + "this." + field.name + " = " + field.name + ";";
  36. };
  37. var createAssigns = function(fields, indentsize) {
  38. var assigns = fields.map(function(f) {
  39. return createAssign(f, indentsize);
  40. });
  41. return assigns.join("\n");
  42. };
  43. var createConstructor = function(clz, fields, indentsize) {
  44. return getIndent(indentsize) + "public " + clz + "(" + createArglist(fields) + ") {\n" + createAssigns(fields, indentsize + defaultindent) + "\n" + getIndent(indentsize) + "}";
  45. };
  46. var createConstructors = function(clz, fields, indentsize) {
  47. return createEmptyConstructor(clz, indentsize) + "\n\n" + createConstructor(clz, fields, indentsize);
  48. };
  49. var getFuncName = function(name) {
  50. return name.substring(0,1).toUpperCase() + name.substring(1);
  51. };
  52. var createSetter = function(field, indentsize) {
  53. var line1 = getIndent(indentsize) + "public void set" + getFuncName(field.name) + "(" + createVariable(field) + ") {";
  54. var line2 = createAssign(field, indentsize + defaultindent);
  55. var line3 = getIndent(indentsize) + "}";
  56. var lines = [line1, line2, line3];
  57. return lines.join("\n");
  58. };
  59. var createGetter = function(field, indentsize) {
  60. var line1 = getIndent(indentsize) + "public " + field.type + " get" + getFuncName(field.name) + "() {";
  61. var line2 = getIndent(indentsize + defaultindent) + "return this." + field.name + ";";
  62. var line3 = getIndent(indentsize) + "}";
  63. var lines = [line1, line2, line3];
  64. return lines.join("\n");
  65. };
  66. var createAccessor = function(field, indentsize) {
  67. var access = [createSetter(field, indentsize), createGetter(field, indentsize)];
  68. return access.join("\n");
  69. };
  70. var createAccessors = function(fields, indentsize) {
  71. var accesses = fields.map(function(f) {return createAccessor(f, indentsize);});
  72. return accesses.join("\n\n");
  73. };
  74. var createClass = function(pkg, clz, fields) {
  75. var line1 = "package " + pkg + ";";
  76. var line2 = "public class " + clz + " {";
  77. var line3 = createFields(fields, defaultindent);
  78. var line4 = createConstructors(clz, fields, defaultindent);
  79. var line5 = createAccessors(fields, defaultindent);
  80. var line6 = "}";
  81. var lines = [line1, line2, line3, line4, line5, line6];
  82. return lines.join("\n\n");
  83. };
  84. var classcontents = schema.map(function(s) {
  85. return createClass(s["package"], s["name"], s["fields"]);
  86. });
  87. for (var i = 0; i < schema.length; i++) {
  88. fs.writeFile(schema[i].name + ".java", classcontents[i], function(e){
  89. if (e) {
  90. console.log("error: " + e);
  91. }
  92. });
  93. }
  94. // schema.js
  95. var schemas = [
  96. {
  97. "name": "TestClass",
  98. "package": "example.com",
  99. "fields": [
  100. {"name": "name", "type": "String"},
  101. {"name": "value", "type": "String"}
  102. ]
  103. }
  104. ]
  105. module.exports = schemas;

代码只是用来做工具用,所以没有写的很完善。如果读者觉得代码有改进之处,欢迎在代码开源之后提交更新。

生成代码的代码 之 POJO生成器的更多相关文章

  1. 生成代码的代码 之 POJO生成器 之二 模板实现

    在之前的一篇博客中,我们写了利用node.js来生成JAVA的POJO代码的方法.有评论说可以利用模板来做这件事.当时认为模板只能做简单的字符串替换,所以可能无法完成任务.但是,仔细的学习了一个模板 ...

  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. 高效能程序员的七个习惯【csdn】

    从网上看到的,感觉挺不错的! Beautiful is better than ugly. Explicit is better than implicit. Simple is better tha ...

  2. hdu-1041(大数模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1041 题意:电脑中存在数字1,进行扩展操作,如果遇到1变为“01”,如果遇到0,变为“10”,经过一次 ...

  3. Docker技术入门与实战(文摘)

    第一部分 基础入门 第1章 初识容器与Docker 第2章 核心概念与安装配置 第二部分 实战案例 第三部分 进阶技能 第四部分 开源项目

  4. KAFKA 监控管理界面 KAFKA EAGLE 安装

    概述 Kafka Eagle监控系统是一款用来监控Kafka集群的工具,目前更新的版本是v1.2.3,支持管理多个Kafka集群.管理Kafka主题(包含查看.删除.创建等).消费者组合消费者实例监控 ...

  5. excel的小bug

    http://muchong.com/html/201710/3913047.html Excel也有相同现象,试着计算:exp(-1.5^2),exp(0-1.5^2),exp(-(1.5)^2)看 ...

  6. hadoop 组件 hdfs架构及读写流程

    一 . Namenode Namenode 是整个系统的管理节点 就像一本书的目录,储存文件信息,地址,接受用户请求,等 二 . Datanode 提供真实的文件数据,存储服务 文件块(block)是 ...

  7. Raft协议学习笔记

    目录 目录 1 1. 前言 1 2. 名词 1 3. 什么是分布式一致性? 3 4. Raft选举 3 4.1. 什么是Leader选举? 3 4.2. 选举的实现 4 4.3. Term和Lease ...

  8. Ng第六课:逻辑回归(Logistic Regression)

    6.1  分类问题 6.2  假说表示 6.3  判定边界 6.4  代价函数 6.5  简化的成本函数和梯度下降 6.6  高级优化 6.7  多类分类:一个对所有 6.1  分类问题 在分类问题中 ...

  9. (广搜)Fire Game -- FZU -- 2150

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82828#problem/I Fire Game Time Limit:1000MS    ...

  10. Leetcode--136. Single Number(easy)

    Given a non-empty array of integers, every element appears twice except for one. Find that single on ...