自己寫的JAVABEAN自動產生器

來源:互聯網
上載者:User

  最近我在學習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的,測試結果完全正常。

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

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.