|
最近我在學(xué)習(xí)JSP,可是在每次寫JAVABEAN的時(shí)候,都發(fā)現(xiàn)好麻煩,要去寫一大堆的GET和SET方法,聽(tīng)說(shuō)ECLIPSE里面有自動(dòng)生成的功能,我何不自己寫一個(gè)。
首選我定義了一個(gè)Attribute類,用來(lái)存放屬性信息(類型和名字)以及為它們生成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; //標(biāo)記變量,保證只生成一次 private int setCount = 0;
/** *生成屬性的set方法 */ private void generateSet() { if (setCount > 0) { return; } setCount++; set.append("\tpublic void set"); //將屬性名第一個(gè)字母置為大寫 set.append(name.substring(0, 1).toUpperCase() + name.substring(1, name.length())); set.append("(" + type + " " + name + ")\n\t{\n"); set.append("\t\tthis." + name + " = " + name + ";\n"); set.append("\t}\n\n"); }
/** *生成屬性的get方法 */ private void generateGet() { if (getCount > 0) { return; } getCount++; get.append("\tpublic " + type + " get"); //將屬性名第一個(gè)字母置為大寫 get.append(name.substring(0, 1).toUpperCase() + name.substring(1, name.length())); get.append("()\n\t{\n"); get.append("\t\treturn " + name + ";\n"); get.append("\t}\n\n"); }
/** *生成屬性的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; }
/** *構(gòu)造函數(shù),傳入?yún)?shù)為屬性的類型和名字 *@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; } };
下面就是自動(dòng)生成JAVABEAN的類AutoBean
package Utils.AutoBean; import java.util.*; import java.io.*;
public class AutoBean { private Stack attr = new Stack(); //屬性對(duì)象棧 private ArrayList strList = new ArrayList(); //屬性行容器 private BufferedReader in = null; private PrintWriter out = null; private StringBuffer text = new StringBuffer(); //最終文本
/** *構(gòu)造函數(shù) *@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 + "\n"); //將每一行入隊(duì)列 strList.add(s); } in.close(); //去除類定義從最后一個(gè)"}"開(kāi)始的字符串 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("\n"); out = new PrintWriter(new BufferedWriter(new FileWriter(path))); } catch (IOException e) { e.printStackTrace(); } }
/** *將屬性從每一行的文本中分割出來(lái),并構(gòu)造屬性對(duì)象后入棧 */ 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("http://") || s.startsWith("{") || s.startsWith("}")) {//去除注釋、包、類定義等 continue; } if (s.indexOf(";") == -1) {//去除非分號(hào)結(jié)尾的行 continue; } //找到最后一個(gè)空格,則從它開(kāi)始至結(jié)尾前一個(gè)為屬性名 int last = s.lastIndexOf(" "); String name = s.substring(last + 1, s.length() - 1); //倒數(shù)第一與倒數(shù)第二空格之前是屬性類型 int backTwo = s.lastIndexOf(" ",last - 1); String type = s.substring(backTwo + 1, last); //將每個(gè)屬性對(duì)象入棧 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("}\n"); writeBack(); }
/** *寫回到文件 */ private void writeBack() { out.print(text.toString()); out.close(); } }
這里面我只考慮了一個(gè)沒(méi)有寫任何屬性的BEAN的一個(gè)簡(jiǎn)單JAVA文件,并且要求代碼的格式要基本上標(biāo)準(zhǔn)的。
下面的代碼是用來(lái)測(cè)試AutoBean的,測(cè)試結(jié)果完全正常。
當(dāng)然,我并沒(méi)有考慮太多的特殊情況,因?yàn)闀簳r(shí)來(lái)講只是我自己偷懶用的,所以測(cè)試也不完全。因?yàn)橹灰业妮斎敫袷秸_了,它就能很好的工作。
如果有時(shí)間的話,我會(huì)把它改進(jìn),讓它能接收更一般的格式,考慮更多的情況,能夠定制對(duì)哪些屬性分別生成只哪些方法等等。或者再給它加上一個(gè)界面,做成一個(gè)小應(yīng)用程序發(fā)到網(wǎng)上。
|