自制的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,或想再添加其它属性方法等,就得自己动手了
虽然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
