最近我在学习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("\tpublic void set"); //将属性名第一个字母置为大写 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"); //将属性名第一个字母置为大写 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; }
/** *构造函数,传入参数为属性的类型和名字 *@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 + "\n"); //将每一行入队列 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("\n"); 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("}\n"); writeBack(); }
/** *写回到文件 */ private void writeBack() { out.print(text.toString()); out.close(); } }
这里面我只考虑了一个没有写任何属性的BEAN的一个简单JAVA文件,并且要求代码的格式要基本上标准的。
下面的代码是用来测试AutoBean的,测试结果完全正常。
当然,我并没有考虑太多的特殊情况,因为暂时来讲只是我自己偷懒用的,所以测试也不完全。因为只要我的输入格式正确了,它就能很好的工作。
如果有时间的话,我会把它改进,让它能接收更一般的格式,考虑更多的情况,能够定制对哪些属性分别生成只哪些方法等等。或者再给它加上一个界面,做成一个小应用程序发到网上。
|