分享

Java写JavaBean代码生成器的EditPlus插件

 hehffyy 2013-12-30

借助Eclipse生成JavaBean的get、set方法。那现在自己写一个JavaBean代码生成器插件,在EditPlus里调用。

 

BeanGenerator.java

 

  1. package codegen;  
  2.   
  3. import java.io.File;  
  4. import java.io.BufferedReader;  
  5. import java.io.FileReader;  
  6. import java.io.RandomAccessFile;  
  7. import java.util.List;  
  8. import java.util.ArrayList;  
  9.   
  10. public class BeanGenerator   
  11. {  
  12.     //存放Bean的类名  
  13.     private String className;  
  14.     //接收生成Bean的文件  
  15.     private File file;  
  16.     //Bean属性和其属性对应的类型的元数据List  
  17.     private List<BeanInfo> bList = new ArrayList<BeanInfo>();  
  18.     //写入流  
  19.     private RandomAccessFile raf = null;  
  20.     //构造方法的参数字符串  
  21.     private StringBuffer paramsBuffer = new StringBuffer();  
  22.     //用来标识构造器参数何时加上","  
  23.     private boolean bFirst = true;  
  24.   
  25.     //解析Bean的属性和其属性对应的类型  
  26.     private void parse(File file) throws Exception  
  27.     {  
  28.         //保存解析的Bean文件  
  29.         this.file = file;  
  30.         //解析出类名  
  31.         this.className = file.getName().substring(0, file.getName().indexOf("."));  
  32.         //读取Bean文件  
  33.         BufferedReader br = new BufferedReader(new FileReader(file));  
  34.         String strLine = null;  
  35.         //逐行读取文件内容  
  36.         while ((strLine = br.readLine()) != null)   
  37.         {  
  38.             //当行内容同时包含private关键字和";"号时则解析该行字符串  
  39.             if (strLine.contains("private") && strLine.contains(";"))   
  40.             {  
  41.                 //获取类型字符串第一个字符的起始位置  
  42.                 Integer leftLoc = strLine.indexOf("private ") + "private ".length();  
  43.                 //获取属性名最后一个字符的位置  
  44.                 Integer rightLoc = strLine.indexOf(";");  
  45.                 //解析出属性类型和属性名,数组[0]为属性类型,数组[1]为属性名  
  46.                 String[] tmpStr = strLine.substring(leftLoc, rightLoc).split(" ");  
  47.                 //装Bean元数据封装并放入集合中  
  48.                 bList.add(new BeanInfo(tmpStr[0], tmpStr[1]));  
  49.             }  
  50.         }    
  51.     }  
  52.   
  53.     //生成Bean的get、set方法和构造方法  
  54.     private void generateSetGetConstructor() throws Exception  
  55.     {       
  56.         raf = new RandomAccessFile(file, "rw");  
  57.         raf.seek(file.length() - 3);  
  58.         raf.writeBytes("/r/n");  
  59.   
  60.         //--------------------生成Bean的构造方法-------------------  
  61.         for (BeanInfo beanInfo : bList)   
  62.         {  
  63.             if (bFirst)   
  64.             {  
  65.                 //第一次构造方法的参数后不加","  
  66.                 paramsBuffer.append(beanInfo.getType() + " "   
  67.                     + beanInfo.getAttr());  
  68.                 bFirst = false;  
  69.             }  
  70.             else   
  71.             {  
  72.                 //当参数列表过长时自动换行  
  73.                 if (paramsBuffer.length() >= 40)   
  74.                 {  
  75.                     paramsBuffer.append("/r/n/t/t" + ", " + beanInfo.getType()   
  76.                         + " " + beanInfo.getAttr());  
  77.                 }  
  78.                 else   
  79.                 {  
  80.                     paramsBuffer.append(", " + beanInfo.getType()   
  81.                         + " " + beanInfo.getAttr());  
  82.                 }     
  83.             }  
  84.         }  
  85.   
  86.         //解决中文问题输出时是乱码  
  87.         raf.write("/t//无参数构造器/r/n".getBytes());  
  88.         //无参数的构造器  
  89.         raf.writeBytes("/tpublic " + className + "()/r/n/t{/r/n/t}/r/n");  
  90.   
  91.         //增加注释  
  92.         raf.write("/t//初始化全部属性的构造器/r/n".getBytes());  
  93.         raf.writeBytes("/tpublic " + className + "("   
  94.             + paramsBuffer.toString() + ")" + "/r/n/t{/r/n");  
  95.         for (BeanInfo beanInfo : bList)   
  96.         {  
  97.             raf.writeBytes("/t/t");  
  98.             raf.writeBytes("this." + beanInfo.getAttr()   
  99.                 + " = " + beanInfo.getAttr() + ";");  
  100.             raf.writeBytes("/r/n");  
  101.         }  
  102.         raf.writeBytes("/t}/r/n");  
  103.         //----------------------------------------------------------  
  104.   
  105.         for (BeanInfo beanInfo : bList)   
  106.         {     
  107.             //增加注释  
  108.             raf.writeBytes("/t//" + beanInfo.getAttr());  
  109.             //解决中文问题输出时是乱码  
  110.             raf.write("属性的setter和getter方法".getBytes());  
  111.             raf.writeBytes("/r/n");  
  112.             //--------------------生成Bean的set方法---------------------  
  113.             raf.writeBytes("/tpublic void set"   
  114.                 + beanInfo.getAttr().substring(01).toUpperCase()   
  115.                 + beanInfo.getAttr().substring(1)   
  116.                 + "(" + beanInfo.getType() + " " + beanInfo.getAttr()   
  117.                 + ")" + "/r/n");  
  118.             raf.writeBytes("/t{" + "/r/n");  
  119.             raf.writeBytes("/t/tthis." + beanInfo.getAttr()   
  120.                 + " = " + beanInfo.getAttr() + ";" + "/r/n");  
  121.             raf.writeBytes("/t}" + "/r/n");  
  122.             //----------------------------------------------------------  
  123.   
  124.             //--------------------生成Bean的get方法---------------------  
  125.             raf.writeBytes("/tpublic "   
  126.                 + beanInfo.getType() + " get"   
  127.                 + beanInfo.getAttr().substring(01).toUpperCase()  
  128.                 + beanInfo.getAttr().substring(1) + "()" + "/r/n");  
  129.             raf.writeBytes("/t{" + "/r/n");  
  130.             raf.writeBytes("/t/treturn " + beanInfo.getAttr()   
  131.                 + ";" + "/r/n/t}/r/n");  
  132.             //----------------------------------------------------------  
  133.         }  
  134.         raf.writeBytes("}/r/n");  
  135.         //关闭写入流  
  136.         raf.close();  
  137.     }  
  138.   
  139.     public static void main(String[] args) throws Exception   
  140.     {  
  141.         BeanGenerator beanGen = new BeanGenerator();  
  142.         beanGen.parse(new File(args[0]));  
  143.         beanGen.generateSetGetConstructor();  
  144.     }  
  145. }  

 

BeanInfo.java

 

  1. package codegen;  
  2. //定义Bean属性和其属性类型的元数据类  
  3. class BeanInfo   
  4. {  
  5.     private String type;  
  6.     private String attr;  
  7.   
  8.     public BeanInfo(String type, String attr)  
  9.     {  
  10.         this.type = type;  
  11.         this.attr = attr;  
  12.     }  
  13.     public void setType(String type)  
  14.     {  
  15.         this.type = type;  
  16.     }  
  17.   
  18.     public String getType()  
  19.     {  
  20.         return type;  
  21.     }  
  22.   
  23.     public void setAttr(String attr)  
  24.     {  
  25.         this.attr = attr;  
  26.     }  
  27.   
  28.     public String getAttr()  
  29.     {  
  30.         return attr;  
  31.     }  
  32. }  

 

配置环境变量,我的包放在D盘下:

 

 

EditPlus工具配置:

 

 

 

 EditPlus的工具栏:

 

配置好后,写一个简单的JavaBean属性测试下:

 

 

按下BeanGenerator工具的快捷键,我这里是Ctrl+3。生成get、set方法。

 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多