1. 程式人生 > >javabean 與固定格式報文相互解包拆包類

javabean 與固定格式報文相互解包拆包類

最近在用java做報文的解包、拆包,其中包括xml報文和javabean之間的轉換,採用了開源框架castor。
   javabean和固定格式報文的轉換,沒有找到相應的開源框架,自己寫了一個通用的類,拋磚引玉一下,請大家參考,歡迎提意見一起探討完善。
   其中,類名、方法名,為了容易看懂,沒有進行縮寫。
   固定報文的格式定義,採用了string的三維陣列,進一步開發,可以放置到xml配置檔案中。目前各種框架都採用xml作為配置檔案。
   欄位長度不夠時,補充字元是char到byte進行了強制轉換,不適用於所有字元。
   其中,Method類生成,每個欄位都生成一個,不能重複使用,通用的反射框架,一般是先對類進行解析,生成靜態變數容器Map,進行儲存,再根據配置檔案,直接去靜態變數容器Map中進行獲取,可以重複使用,這裡是可以進一步完善的地方。
   一個類只能簡單的做到對報文生成解析工作與報文的具體格式的解耦,不再需要為每一個報文的生成和解析分別寫一個方法,報文變了可以只修改報文定義的String陣列就可以。
Java程式碼  收藏程式碼
  1. import java.io.UnsupportedEncodingException;  
  2. import java.lang.reflect.InvocationTargetException;  
  3. import java.lang.reflect.Method;  
  4. import java.util.List;  
  5. publicclass JavaBeanConvertFixedLengthPacket {  
  6.     /** 
  7.      * 將pojo按照requestPacketFormatArray三維陣列定義的格式生成固定格式報文 
  8.      * @param requestPacketFormatArray
     
  9.      * @param pojo 
  10.      * @param rightCharStr 
  11.      * @param leftCharStr 
  12.      * @param charsetName 
  13.      * @return 
  14.      * @throws Exception 
  15.      */
  16.     publicstatic String javaBeanToFixedLengthPacket(String[][][] requestPacketFormatArray,Object pojo,char rightCharStr,char leftCharStr,String charsetName) 
    throws Exception{  
  17.         String fieldName = new String();  
  18.         String fieldLenght = new String();  
  19.         String parameterClass = new String();  
  20.         StringBuffer requestStr = new StringBuffer();  
  21.         int requestPacketFormatArrayLength = requestPacketFormatArray.length;  
  22.         for(int i=0;i<requestPacketFormatArrayLength;i++){  
  23.             String[][] requestFieldFormatArray = requestPacketFormatArray[i];  
  24.             int requestFieldFormatArrayLength = requestFieldFormatArray.length;  
  25.             if(requestFieldFormatArrayLength!=3){  
  26.                 thrownew Exception("invalid field defined");  
  27.             }  
  28.             for(int j=0;j<requestFieldFormatArrayLength;j++){  
  29.                 String[] requestPropertyFormatArray = requestFieldFormatArray[j];  
  30.                 int requestPropertyFormatArrayLength = requestPropertyFormatArray.length;  
  31.                 if(requestPropertyFormatArrayLength!=2){  
  32.                     thrownew Exception("invalid field property defined");  
  33.                 }  
  34.                 if(requestPropertyFormatArray[0].equals("name"))  
  35.                     fieldName = requestPropertyFormatArray[1];  
  36.                 if(requestPropertyFormatArray[0].equals("length"))  
  37.                     fieldLenght = requestPropertyFormatArray[1];  
  38.                 if(requestPropertyFormatArray[0].equals("parameterClass"))  
  39.                     parameterClass = requestPropertyFormatArray[1];  
  40.             }  
  41.             Class c = pojo.getClass();  
  42.             Method m = c.getMethod("get"  + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1));  
  43.             String fieldValue = m.invoke(pojo)==null?"":m.invoke(pojo).toString();  
  44.             if(parameterClass.equals("java.lang.String"))  
  45.                 requestStr.append(formatFieldByRightChar(fieldValue,Integer.parseInt(fieldLenght),rightCharStr,charsetName));  
  46.             else{  
  47.                 requestStr.append(formatFieldByLeftChar(fieldValue,Integer.parseInt(fieldLenght),leftCharStr,charsetName));  
  48.             }  
  49.         }  
  50.         return requestStr.toString();  
  51.     }  
  52.     /** 
  53.      * 將strByte字串按照requestPacketFormatArray三維陣列定義的格式生pojo 
  54.      * @param requestPacketFormatArray 
  55.      * @param pojo 
  56.      * @param strByte 
  57.      * @param charsetName 
  58.      * @throws Exception 
  59.      */
  60.     publicstaticvoid fixedLengthPacketToJavaBean(String[][][] requestPacketFormatArray,Object pojo,String str,String charsetName) throws Exception{  
  61.         String fieldName = new String();  
  62.         String fieldLenght = new String();  
  63.         String parameterClass = new String();  
  64.         StringBuffer requestStr = new StringBuffer();  
  65.         byte[] strByte = str.getBytes(charsetName);  
  66.         int index = 0;  
  67.         int length = strByte.length;  
  68.         int requestPacketFormatArrayLength = requestPacketFormatArray.length;  
  69.         for(int i=0;i<requestPacketFormatArrayLength;i++){  
  70.             String[][] requestFieldFormatArray = requestPacketFormatArray[i];  
  71.             int requestFieldFormatArrayLength = requestFieldFormatArray.length;  
  72.             if(requestFieldFormatArrayLength!=3){  
  73.                 thrownew Exception("invalid field defined");  
  74.             }  
  75.             for(int j=0;j<requestFieldFormatArrayLength;j++){  
  76.                 String[] requestPropertyFormatArray = requestFieldFormatArray[j];  
  77.                 int requestPropertyFormatArrayLength = requestPropertyFormatArray.length;  
  78.                 if(requestPropertyFormatArrayLength!=2){  
  79.                     thrownew Exception("invalid field property defined");  
  80.                 }  
  81.                 if(requestPropertyFormatArray[0].equals("name"))  
  82.                     fieldName = requestPropertyFormatArray[1];  
  83.                 if(requestPropertyFormatArray[0].equals("length"))  
  84.                     fieldLenght = requestPropertyFormatArray[1];  
  85.                 if(requestPropertyFormatArray[0].equals("parameterClass"))  
  86.                     parameterClass = requestPropertyFormatArray[1];  
  87.             }  
  88.             Class c = pojo.getClass();  
  89.             int tempLenght = Integer.parseInt(fieldLenght);  
  90.             byte[] byteTemp = newbyte[tempLenght];  
  91.             for(int k=0;k<tempLenght;k++)  
  92.                     byteTemp[k] = strByte[index+k];  
  93.             index = index+tempLenght;  
  94.             if(parameterClass.equals("java.lang.String")){  
  95.                 Method m = c.getMethod("set"  + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1),Class.forName(parameterClass));  
  96.                 m.invoke(pojo,new String(byteTemp).trim());  
  97.             }  
  98.             elseif(parameterClass.equals("int")){  
  99.                 Method m = c.getMethod("set"  + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1),int.class);;  
  100.                 //Method mArray[] = c.getDeclaredMethods();
  101.                 //for(Method mTemp:mArray)
  102.                 //  if(mTemp.getName().equals("set"  + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1)))
  103.                 //      m=mTemp;
  104.                 m.invoke(pojo,Integer.valueOf(new String(byteTemp)));  
  105.             }  
  106.             elseif(parameterClass.equals("long")){  
  107.                 Method m = null;  
  108.                 Method mArray[] = c.getDeclaredMethods();  
  109.                 for(Method mTemp:mArray)  
  110.                     if(mTemp.getName().equals("set"  + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1)))  
  111.                         m=mTemp;  
  112.                 m.invoke(pojo,Long.valueOf(new String(byteTemp)));  
  113.             }  
  114.             elseif(parameterClass.equals("float")){  
  115.                 Method m = null;  
  116.                 Method mArray[] = c.getDeclaredMethods();  
  117.                 for(Method mTemp:mArray)  
  118.                     if(mTemp.getName().equals("set"  + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1)))  
  119.                         m=mTemp;  
  120.                 m.invoke(pojo,Float.valueOf(new String(byteTemp)));  
  121.             }  
  122.         }  
  123.     }  
  124.     /** 
  125.      * str右補charStr引數指定的字元,格式化為指定byte長度為size的字串 
  126.      * @param str 原字串大小 
  127.      * @param size byte長度 
  128.      * @param charStr 補充字元 
  129.      * *@param  charsetName 
  130.      * the name of a supported 
  131.      * {@link java.nio.charset.Charset </code>charset<code>} 
  132.      * @return 
  133.      * @throws UnsupportedEncodingException  
  134.      */
  135.     publicstatic String formatFieldByRightChar(String str,int size,char charStr,String charsetName) throws UnsupportedEncodingException  
  136.     {  
  137.         byte[] bufferByte = newbyte[size];  
  138.         for (int i = 0; i < bufferByte.length; i++)  
  139.         {  
  140.             bufferByte[i] = (byte) charStr;  
  141.         }  
  142.         byte[] strByte    = str.getBytes(charsetName); // 得到字元的位元組數
  143.         int strLength     = strByte.length;  
  144.         System.arraycopy(strByte, 0, bufferByte, 0, size>strLength?strLength:size);  
  145.         returnnew String(bufferByte);  
  146.     }  
  147.     publicstatic String formatFieldByRightChar(String str,int size,String charsetName) throws UnsupportedEncodingException  
  148.     {  
  149.         return formatFieldByRightChar(charsetName, size, ' ', charsetName);  
  150.     }  
  151.     /** 
  152.      * str左補charStr引數指定的字元,格式化為指定byte長度為size的字串 
  153.      * @param str 原字串大小 
  154.      * @param size byte長度 
  155.      * @param charStr 補充字元 
  156.      * @param  charsetName 
  157.      * the name of a supported 
  158.      * {@link java.nio.charset.Charset </code>charset<code>} 
  159.      * @return 
  160.      * @throws UnsupportedEncodingException  
  161.      */
  162.     publicstatic String formatFieldByLeftChar(String str,int size,char charStr,String charsetName) throws UnsupportedEncodingException  
  163.     {  
  164.         byte[] bufferByte = newbyte[size];  
  165.         for (int i = 0; i < bufferByte.length; i++)  
  166.         {  
  167.             bufferByte[i] = (byte) charStr;  
  168.         }  
  169.         byte[] strByte    = str.getBytes(charsetName);  
  170.         int strLength     = strByte.length;  
  171.         System.arraycopy(strByte, 0, bufferByte, (size-strLength)>0?(size-strLength):0, (size-strLength)>0?strLength:size);  
  172.         returnnew String(bufferByte);  
  173.     }  
  174.     /** 
  175.      * @param str 
  176.      * @param size 
  177.      * @param charsetName 
  178.      * @return 
  179.      * @throws UnsupportedEncodingException 
  180.      */
  181.     publicstatic String formatFieldByLeftChar(String str,int size,String charsetName) throws UnsupportedEncodingException  
  182.     {  
  183.         return formatFieldByLeftChar(str,size,'0',charsetName);  
  184.     }  
  185.     publicstaticvoid main(String args[]){  
  186.         class TestInvode{  
  187.             String cardno;  
  188.             String name;  
  189.             int num;  
  190.             float amount;  
  191.             public String getCardno() {  
  192.                 return cardno;  
  193.             }  
  194.             publicvoid setCardno(String cardno) {  
  195.                 this.cardno = cardno;  
  196.             }  
  197.             public String getName() {  
  198.                 return name;  
  199.             }  
  200.             publicvoid setName(String name) {  
  201.                 this.name = name;  
  202.             }  
  203.             publicint getNum() {  
  204.                 return num;  
  205.             }  
  206.             publicvoid setNum(int num) {  
  207.                 this.num = num;  
  208.             }  
  209.             publicfloat getAmount() {  
  210.                 return amount;  
  211.             }  
  212.             publicvoid setAmount(float amount) {  
  213.                 this.amount = amount;  
  214.             }  
  215.         }  
  216.         String requestFormat[][][] =   
  217.          {  
  218.                     {  
  219.                         {"name","cardno"},{"length","16"},{"parameterClass","java.lang.String"}  
  220.                     },  
  221.                     {  
  222.                         {"name","name"},{"length","10"},{"parameterClass","java.lang.String"}  
  223.                     }  
  224.                     ,  
  225.                     {  
  226.                         {"name","num"},{"length","10"},{"parameterClass","int"}  
  227.                     },  
  228.                     {  
  229.                         {"name","amount"},{"length","10"},{"parameterClass","float"}  
  230.                     }  
  231.          };  
  232.         TestInvode ti = new TestInvode();  
  233.         ti.cardno = "4512";  
  234.         ti.name="不告訴你";  
  235.         ti.num = 95;  
  236.         ti.amount=45454.44f;  
  237.         try {  
  238.             System.out.println("######"+javaBeanToFixedLengthPacket(requestFormat, ti, ' ''0'"gb2312"));  
  239.         } catch (Exception e) {  
  240.             e.printStackTrace();  
  241.         }  
  242.         String str = "4512            不告訴你  00000000950045454.44";  
  243.         TestInvode tii = new TestInvode();  
  244.         try {  
  245.             fixedLengthPacketToJavaBean(requestFormat, tii, str,"gb2312");  
  246.         } catch (Exception e) {  
  247.             e.printStackTrace();  
  248.         }  
  249.         System.out.println("######tii.cardno:"+tii.cardno);  
  250.         System.out.println("######tii.name:"+tii.name);  
  251.         System.out.println("######tii.num:"+tii.num);  
  252.         String s = "人";  
  253.         try {  
  254.             System.out.println(s.getBytes("utf-8").length);  
  255.         } catch (UnsupportedEncodingException e) {  
  256.             // TODO Auto-generated catch block
  257.             e.printStackTrace();  
  258.         }  
  259.         System.out.println(Thread.currentThread().getContextClassLoader());  
  260.         System.out.println(tii.getClass().getClassLoader());  
  261.         System.out.println(ClassLoader.getSystemClassLoader());  
  262.     }  
  263. }