最近我在學(xué)習(xí)JSP,可是在每次寫JAVABEAN的時(shí)候,都發(fā)現(xiàn)好麻煩,要去寫一大堆的GET和SET方法,聽說ECLIPSE里面有自動(dòng)生成的功能,我何不自己寫一個(gè)。
首選我定義了一個(gè)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; //標(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è)"}"開始的字符串
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();
}
}
/**
*將屬性從每一行的文本中分割出來,并構(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è)空格,則從它開始至結(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è)沒有寫任何屬性的BEAN的一個(gè)簡(jiǎn)單JAVA文件,并且要求代碼的格式要基本上標(biāo)準(zhǔn)的。
下面的代碼是用來測(cè)試AutoBean的,測(cè)試結(jié)果完全正常。
當(dāng)然,我并沒有考慮太多的特殊情況,因?yàn)闀簳r(shí)來講只是我自己偷懶用的,所以測(cè)試也不完全。因?yàn)橹灰业妮斎敫袷秸_了,它就能很好的工作。
如果有時(shí)間的話,我會(huì)把它改進(jìn),讓它能接收更一般的格式,考慮更多的情況,能夠定制對(duì)哪些屬性分別生成只哪些方法等等。或者再給它加上一個(gè)界面,做成一個(gè)小應(yīng)用程序發(fā)到網(wǎng)上。
聯(lián)系客服