自制的JavaBean自动生成器
平时写程序常常要写一些JavaBean, 它很简单,规则固定,JavaBean是内省的,一些属性和相应的get- set- 方法,默认的构造器,实现Serializable
虽然JavaBean很简单但写起来也是很烦的,如果有jbuilder等开发工具就太方便了,但自己的机器又难以承受如此的大型工具,所以就动手写了一个JavaBean自动生成器

思路很简单,先获得要生成的JavaBean的属性,然后把这些属性和相应的get- set- 方法生成出来写到文件里就行了

我选用的获得属性方式是xml 文件, 文件形式这样:

javabean.xml:
<javabean>
<package></package>
<class-name></class-name>
<property name="" type=""/>
<property name=
"" type=""/>
. . .
</javabean>

由于这个JavaBean生成器是自己偷懒用的,xml文件也没定义DTD,解析xml 用开源项目广泛采用的 dom4j
把xml文件内容解析出来后保存起来,属性都放在容器中,然后就开始一行行写JavaBean了


/**
* @author irini
*/

import org.dom4j.*;
import org.dom4j.io.*;
import java.io.*;
import java.util.*;

public class AutoJavaBean {
public String className;
// 要生产的javabean的类名
public String packageName;
// 要生产的javabean的类名
public ArrayList arraylist = new ArrayList();
// 属性容器
public PrintWriter pw;
public StringBuffer sb = new StringBuffer();
/**
* 定义javabean中的属性.
* 这个javabean生成器只是一个小工具,为让它尽量小巧就用了内部类
*/

class Property {
public String name;
// 属性名字
public String type;
// 属性类型

public void setName( String name ){
this.name = name;
}
public String getName(){
return name;
}

public void setType( String type ){
this.type = type;
}
public String getType(){
return type;
}
}

/**
*从文件读取XML,输入文件名,返回XML文档
*/

public Document read(String fileName) throws Exception {
SAXReader reader = new SAXReader();
Document document = reader.read(new File(fileName));
return document;
}

/**
* 解析XML文档.
* 得到类名包名.
* 把所有属性放入容器
*/

public void parse( Document doc ){

Element root = doc.getRootElement();
// 得到根节点
packageName = root.element(
"package" ).getStringValue(); // 得到包名
className = root.element(
"class-name" ).getStringValue(); // 得到类名

// 枚举所有子节点,把所有属性放入容器
for ( Iterator i = root.elementIterator(); i.hasNext(); ) {
Element element = (Element) i.next();
Property pro = null;
String name = null;
String type = null;
if( element.getQualifiedName().equals(
"property" ) ){
name = element.attributeValue(
"name" );
type = element.attributeValue(
"type" );

// 设置属性类
pro = (new AutoJavaBean()).new Property();
pro.setName( name );
pro.setType( type );

// 向容器添加属性
arraylist.add( pro );
}
}

}

/**
* 写出javabean的开始部分.
* package import class
*/

public void start() {
if( packageName.length() != 0 ){
sb.append(
"package " + packageName + ";\n\n" );
}
sb.append(
"import java.io.Serializable;\n\n" );
sb.append(
"public class " + className + " implements Serializable { \n" );
}

/**
* 写javabean的属性部分
*/

public void generateProperties() {
ListIterator lit = arraylist.listIterator();
Property pro = null;
while( lit.hasNext() ){
pro = (Property)lit.next();
sb.append(
"\tpublic " + pro.getType() + " " + pro.getName() + ";\n" );
}
sb.append(
"\n" );
}

/**
* 写每个属性的 set() and get()
*/

public void generateMethods() {
ListIterator lit = arraylist.listIterator();
Property pro = null;
String name = null;
String type = null;
while( lit.hasNext() ){
pro = (Property)lit.next();
name = pro.getName();
type = pro.getType();

// set()
sb.append(
"\tpublic void set" +
name.substring(0,1).toUpperCase() +
name.substring( 1, name.length() ) +
"( " + type + " " + name + " ) {\n" );
sb.append(
"\t\tthis." + name + " = " + name + ";\n" );
sb.append(
"\t}\n" );

// get()
sb.append(
"\tpublic " + type + " get" +
name.substring(0,1).toUpperCase() +
name.substring( 1, name.length() ) +
"(){\n" );
sb.append(
"\t\treturn " + name + ";\n" );
sb.append(
"\t}\n" );
}
}

/**
* 添加结尾"}"
*/

public void end() {
sb.append(
"}\n" );
}

/**
* 把生产的所有内容输出到真正的文件中
*/

public void makeFile() {
try{
pw = new PrintWriter( new FileWriter( className +
".java" ) );
pw.print( sb.toString() );
pw.close();
}catch( Exception e ){
}
}

public void demo() {
try{
parse( read(
"javabean.xml" ) );
start();
generateProperties();
generateMethods();
end();
makeFile();
}catch( Exception e ){
e.printStackTrace();
}
}

public static void main( String[] args ){
AutoJavaBean jb = new AutoJavaBean();
jb.demo();
}
}


测试结果还不错,只要格式正确,能正常工作就行了
这里只实现了一个常规的JavaBean, 如果想某个属性或方法不是public,或想再添加其它属性方法等,就得自己动手了
irini   2005-12-31 09:33:23 评论:0   阅读:418   引用:0

发表评论>>

署名发表(评论可管理,不必输入下面的姓名)

姓名:

主题:

内容: 最少15个,最长1000个字符

验证码: (如不清楚,请刷新)

Copyright@2008 powered by YuLog