java pojo生成_生成代码的代码 之 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;

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
POJOGenerator(POJO代码生成器 v1.2) 本POJO代码生成器采用Java的Swing技术编码实现,是绿色免费工具,可以自由传播。 由于本工具的内部实现较菜,所以还请反编译高手手下留情,让我留几分颜面。^_^ 作者本人只用过Oracle、MySQL、MS SQL Server这三款数据库产品,所以制作成exe 可执行文件时只添入了这三款数据库的驱动支持。如果您需要使用这款工具从其它 数据库中生成POJO,那么您可以联系我(Email:CodingMouse@gmail.com),我会 添加其它数据库的驱动支持后通过电子邮件发送给您。 简单的使用说明: 1、先将压缩档解压到任意文件夹。 2、可以预先在配置档cmsdk4j.cfg.xml中设定您的数据库服务器配置,配置档中已经 提供了默认的配置信息,您仅需在此基础上修改部分参数(如:IP地址、端口号、 用户名、密码、数据库名等),这些参数将作为生成器的预设数据库连接配置参数。 3、可以预先在配置档generator.cfg.xml中设定您的数据型映射方案,配置档中已经 提供了MS SQL Server和Oracle两种映射方案,当然,可能有不太完整的地方,您可以 根据实际情况稍作修改即可。需要注意的一点是ref属性表示引用同一映射方案的另一 映射,这样您便可以简化同一映射数据型的配置;而import属性是指定需要在最终 生成的源代码中作为最开始的package型导入声明部分的导入型名称,因此,这 个名称是完整带包名的名称,否则不能正确生成最终代码。配置档中提供的默认配置 如果不能满足你的需要,也可以自行根据实际情况进行修改。 4、所有配置档仅在工具启动初始读取一次并缓存到内存中,因此,如果您是在工具运行 时修改的配置档,请重新启动本工具以使新的配置生效。并且,所有配置档的XML结构均 不能修改,只能修改其节点间的文本值或属性值,否则会导致本工具无法工作。 5、所有最终代码生成效果都可以在左边的代码预览区域中查看和进行二次修改,点击 【写入磁盘文件】按钮生成到磁盘文件时将以代码预览区中的内容为准。当然,通常 更好的做法是将最终代码生成后拷贝到您的项目对应文件夹中。最好不要直接指向您的 项目文件夹,因为本工具会直接覆盖掉指定目录中同名的文件。最终生成代码文件以 .java为扩展名。 如果您有好的建议,请发送留言到作者博客:http://blog.csdn.net/CodingMouse 或发送邮件到:CodingMouse@gmail.com 本工具已经打包成exe可执行文件,便于在Window环境下运行,但仍需要你的机器上 安装至少1.5版本的jre环境。 关联文章:http://blog.csdn.net/CodingMouse/archive/2009/07/13/4345782.aspx http://www.java2000.net/p17774 By CodingMouse 2009年7月14日

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值