java bean生成_JAVABEAN自動產生器

最近我在學習JSP,可是在每次寫JAVABEAN的時候,都發現好麻煩,要去寫一大堆的GET和SET方法,聽說ECLIPSE裡面有自動生成的功能,我何不自己寫一個。

首選我定義了一個Attribute類,用來存放屬性訊息(型別和名字)以及為它們生成GET/SET方法。

package Utils.AutoBean;

import java.util.*;

class Attribute

{

private String type; //屬性的型別

private String name; //屬性的名字

private StringBuffer get = new StringBuffer(); //為屬性生成的GET方法

private StringBuffer set = new StringBuffer(); //為屬性生成的SET方法

private int getCount = 0; //標記變數,保證只生成一次

private int setCount = 0;

/**

*生成屬性的set方法

*/

private void generateSet()

{

if (setCount > 0)

{

return;

}

setCount++;

set.append(" public void set");

//將屬性名第一個字母置為大寫

set.append(name.substring(0, 1).toUpperCase() + name.substring(1, name.length()));

set.append("(" + type + " " + name + ")
{
");

set.append(" this." + name + " = " + name + ";
");

set.append(" }

");

}

/**

*生成屬性的get方法

*/

private void generateGet()

{

if (getCount > 0)

{

return;

}

getCount++;

get.append(" public " + type + " get");

//將屬性名第一個字母置為大寫

get.append(name.substring(0, 1).toUpperCase() + name.substring(1, name.length()));

get.append("()
{
");

get.append(" return " + name + ";
");

get.append(" }

");

}

/**

*生成屬性的set和get方法

*/

private void generateBean()

{

//生成 set 方法

generateSet();

//生成 get 方法

generateGet();

}

/**

*取得屬性的GET 和 SET 方法

*/

public StringBuffer getBean()

{

generateBean();

StringBuffer sb = new StringBuffer();

sb.append(set);

sb.append(get);

return sb;

}

/**

*取得屬性的get方法

*/

public StringBuffer getGet()

{

generateGet();

return get;

}

/**

*取得屬性的set方法

*/

public StringBuffer getSet()

{

generateSet();

return set;

}

/**

*建構函式,傳入引數為屬性的型別和名字

*@param type 屬性的型別

*@param name 屬性的名字

*/

public Attribute(String type, String name)

{

this.type = type;

this.name = name;

}

public void setType(String type)

{

this.type = type;

}

public void setName(String name)

{

this.name = name;

}

public String getType()

{

return type;

}

public String getName()

{

return name;

}

};

下面就是自動生成JAVABEAN的類AutoBean

package Utils.AutoBean;

import java.util.*;

import java.io.*;

public class AutoBean

{

private Stack attr = new Stack(); //屬性物件棧

private ArrayList strList = new ArrayList(); //屬性行容器

private BufferedReader in = null;

private PrintWriter out = null;

private StringBuffer text = new StringBuffer(); //最終文字

/**

*建構函式

*@param path 要生成JAVABEAN的JAVA檔案路徑

*/

public AutoBean(String path)

{

String s = "";

try

{

in = new BufferedReader(new FileReader(path));

while ((s = in.readLine()) != null)

{

//將類的屬性宣告儲存在text中

text.append(s + "
");

//將每一行入佇列

strList.add(s);

}

in.close();

//去除類定義從最後一個"}"開始的字串

int lst = text.lastIndexOf("}");

if (lst == -1)

{

System.out.println("Error : Not a correct java file!");

System.exit(1);

}

text = new StringBuffer(text.substring(0, lst));

text.append("
");

out = new PrintWriter(new BufferedWriter(new FileWriter(path)));

}

catch (IOException e)

{

e.printStackTrace();

}

}

/**

*將屬性從每一行的文字中分割出來,並建構屬性物件後入棧

*/

private void cutAttr()

{

int index = 0;

String s = "";

for (int i = 0 ;i < strList.size() ;i++ )

{

s = (String)strList.get(i);

//先去掉頭尾的空白

s = s.trim();

if (s == "")

{//去除空行

continue;

}

if (s.startsWith("package") || s.startsWith("import") || (s.indexOf("class") != -1 && s.indexOf(";") == -1)

|| s.startsWith("/*") || s.startsWith("*/") || s.startsWith("//")

|| s.startsWith("{") || s.startsWith("}"))

{//去除註解、包、類定義等

continue;

}

if (s.indexOf(";") == -1)

{//去除非分號結尾的行

continue;

}

//找到最後一個空白,則從它開始至結尾前一個為屬性名

int last = s.lastIndexOf(" ");

String name = s.substring(last + 1, s.length() - 1);

//倒數第一與倒數第二空白之前是屬性型別

int backTwo = s.lastIndexOf(" ",last - 1);

String type = s.substring(backTwo + 1, last);

//將每個屬性物件入棧

attr.push(new Attribute(type, name));

}

}

/**

*生成JAVA檔案的JAVABEAN形式的字串,並將源檔案改變

*/

public void generateBean()

{

cutAttr();

Attribute tmp;

while (!attr.empty())

{

tmp = (Attribute)attr.pop();

text.append(tmp.getBean());

}

//將"}"加入到末尾

text.append("}
");

writeBack();

}

/**

*寫回到檔案

*/

private void writeBack()

{

out.print(text.toString());

out.close();

}

}

這裡面我只考慮了一個沒有寫任何屬性的BEAN的一個簡單JAVA檔案,並且要求程式碼的格式要基本上標準的。

下面的程式碼是用來測試AutoBean的,測試結果完全正常。

當然,我並沒有考慮太多的特殊情況,因為暫時來講只是我自己偷懶用的,所以測試也不完全。因為只要我的輸入格式正確了,它就能很好的工作。

如果有時間的話,我會把它改進,讓它能接收更一般的格式,考慮更多的情況,能夠定製對哪些屬性分別生成只哪些方法等等。或者再給它加上一個介面,做成一個小應用程式發到網上。