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.   
  6.   
  7. public class JavaBeanConvertFixedLengthPacket {  
  8.   
  9.     /** 
  10.      * 将pojo按照requestPacketFormatArray三维数组定义的格式生成固定格式报文 
  11.      * @param requestPacketFormatArray 
  12.      * @param pojo 
  13.      * @param rightCharStr 
  14.      * @param leftCharStr 
  15.      * @param charsetName 
  16.      * @return 
  17.      * @throws Exception 
  18.      */  
  19.     public static String javaBeanToFixedLengthPacket(String[][][] requestPacketFormatArray,Object pojo,char rightCharStr,char leftCharStr,String charsetName) throws Exception{  
  20.         String fieldName = new String();  
  21.         String fieldLenght = new String();  
  22.         String parameterClass = new String();  
  23.         StringBuffer requestStr = new StringBuffer();  
  24.         int requestPacketFormatArrayLength = requestPacketFormatArray.length;  
  25.         for(int i=0;i<requestPacketFormatArrayLength;i++){  
  26.             String[][] requestFieldFormatArray = requestPacketFormatArray[i];  
  27.             int requestFieldFormatArrayLength = requestFieldFormatArray.length;  
  28.             if(requestFieldFormatArrayLength!=3){  
  29.                 throw new Exception("invalid field defined");  
  30.             }  
  31.             for(int j=0;j<requestFieldFormatArrayLength;j++){  
  32.                 String[] requestPropertyFormatArray = requestFieldFormatArray[j];  
  33.                 int requestPropertyFormatArrayLength = requestPropertyFormatArray.length;  
  34.                 if(requestPropertyFormatArrayLength!=2){  
  35.                     throw new Exception("invalid field property defined");  
  36.                 }  
  37.                 if(requestPropertyFormatArray[0].equals("name"))  
  38.                     fieldName = requestPropertyFormatArray[1];  
  39.                 if(requestPropertyFormatArray[0].equals("length"))  
  40.                     fieldLenght = requestPropertyFormatArray[1];  
  41.                 if(requestPropertyFormatArray[0].equals("parameterClass"))  
  42.                     parameterClass = requestPropertyFormatArray[1];  
  43.             }  
  44.             Class c = pojo.getClass();  
  45.             Method m = c.getMethod("get"  + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1));  
  46.             String fieldValue = m.invoke(pojo)==null?"":m.invoke(pojo).toString();  
  47.             if(parameterClass.equals("java.lang.String"))  
  48.                 requestStr.append(formatFieldByRightChar(fieldValue,Integer.parseInt(fieldLenght),rightCharStr,charsetName));  
  49.             else{  
  50.                 requestStr.append(formatFieldByLeftChar(fieldValue,Integer.parseInt(fieldLenght),leftCharStr,charsetName));  
  51.             }  
  52.               
  53.         }  
  54.         return requestStr.toString();  
  55.     }  
  56.     /** 
  57.      * 将strByte字符串按照requestPacketFormatArray三维数组定义的格式生pojo 
  58.      * @param requestPacketFormatArray 
  59.      * @param pojo 
  60.      * @param strByte 
  61.      * @param charsetName 
  62.      * @throws Exception 
  63.      */  
  64.     public static void fixedLengthPacketToJavaBean(String[][][] requestPacketFormatArray,Object pojo,String str,String charsetName) throws Exception{  
  65.         String fieldName = new String();  
  66.         String fieldLenght = new String();  
  67.         String parameterClass = new String();  
  68.         StringBuffer requestStr = new StringBuffer();  
  69.         byte[] strByte = str.getBytes(charsetName);  
  70.         int index = 0;  
  71.         int length = strByte.length;  
  72.         int requestPacketFormatArrayLength = requestPacketFormatArray.length;  
  73.         for(int i=0;i<requestPacketFormatArrayLength;i++){  
  74.             String[][] requestFieldFormatArray = requestPacketFormatArray[i];  
  75.             int requestFieldFormatArrayLength = requestFieldFormatArray.length;  
  76.             if(requestFieldFormatArrayLength!=3){  
  77.                 throw new Exception("invalid field defined");  
  78.             }  
  79.             for(int j=0;j<requestFieldFormatArrayLength;j++){  
  80.                 String[] requestPropertyFormatArray = requestFieldFormatArray[j];  
  81.                 int requestPropertyFormatArrayLength = requestPropertyFormatArray.length;  
  82.                 if(requestPropertyFormatArrayLength!=2){  
  83.                     throw new Exception("invalid field property defined");  
  84.                 }  
  85.                 if(requestPropertyFormatArray[0].equals("name"))  
  86.                     fieldName = requestPropertyFormatArray[1];  
  87.                 if(requestPropertyFormatArray[0].equals("length"))  
  88.                     fieldLenght = requestPropertyFormatArray[1];  
  89.                 if(requestPropertyFormatArray[0].equals("parameterClass"))  
  90.                     parameterClass = requestPropertyFormatArray[1];  
  91.             }  
  92.             Class c = pojo.getClass();  
  93.             int tempLenght = Integer.parseInt(fieldLenght);  
  94.             byte[] byteTemp = new byte[tempLenght];  
  95.             for(int k=0;k<tempLenght;k++)  
  96.                     byteTemp[k] = strByte[index+k];  
  97.             index = index+tempLenght;  
  98.             if(parameterClass.equals("java.lang.String")){  
  99.                 Method m = c.getMethod("set"  + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1),Class.forName(parameterClass));  
  100.                 m.invoke(pojo,new String(byteTemp).trim());  
  101.             }  
  102.             else if(parameterClass.equals("int")){  
  103.                 Method m = c.getMethod("set"  + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1),int.class);;  
  104.                 //Method mArray[] = c.getDeclaredMethods();  
  105.                 //for(Method mTemp:mArray)  
  106.                 //  if(mTemp.getName().equals("set"  + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1)))  
  107.                 //      m=mTemp;  
  108.                 m.invoke(pojo,Integer.valueOf(new String(byteTemp)));  
  109.             }  
  110.             else if(parameterClass.equals("long")){  
  111.                 Method m = null;  
  112.                 Method mArray[] = c.getDeclaredMethods();  
  113.                 for(Method mTemp:mArray)  
  114.                     if(mTemp.getName().equals("set"  + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1)))  
  115.                         m=mTemp;  
  116.                 m.invoke(pojo,Long.valueOf(new String(byteTemp)));  
  117.             }  
  118.             else if(parameterClass.equals("float")){  
  119.                 Method m = null;  
  120.                 Method mArray[] = c.getDeclaredMethods();  
  121.                 for(Method mTemp:mArray)  
  122.                     if(mTemp.getName().equals("set"  + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1)))  
  123.                         m=mTemp;  
  124.                 m.invoke(pojo,Float.valueOf(new String(byteTemp)));  
  125.             }  
  126.         }  
  127.     }  
  128.     /** 
  129.      * str右补charStr参数指定的字符,格式化为指定byte长度为size的字符串 
  130.      * @param str 原字符串大小 
  131.      * @param size byte长度 
  132.      * @param charStr 补充字符 
  133.      * *@param  charsetName 
  134.      * the name of a supported 
  135.      * {@link java.nio.charset.Charset </code>charset<code>} 
  136.      * @return 
  137.      * @throws UnsupportedEncodingException  
  138.      */  
  139.     public static String formatFieldByRightChar(String str,int size,char charStr,String charsetName) throws UnsupportedEncodingException  
  140.     {  
  141.         byte[] bufferByte = new byte[size];  
  142.         for (int i = 0; i < bufferByte.length; i++)  
  143.         {  
  144.             bufferByte[i] = (byte) charStr;  
  145.         }  
  146.         byte[] strByte    = str.getBytes(charsetName); // 得到字符的字节数  
  147.         int strLength     = strByte.length;  
  148.         System.arraycopy(strByte, 0, bufferByte, 0, size>strLength?strLength:size);  
  149.         return new String(bufferByte);  
  150.     }  
  151.     public static String formatFieldByRightChar(String str,int size,String charsetName) throws UnsupportedEncodingException  
  152.     {  
  153.         return formatFieldByRightChar(charsetName, size, ' ', charsetName);  
  154.     }  
  155.     /** 
  156.      * str左补charStr参数指定的字符,格式化为指定byte长度为size的字符串 
  157.      * @param str 原字符串大小 
  158.      * @param size byte长度 
  159.      * @param charStr 补充字符 
  160.      * @param  charsetName 
  161.      * the name of a supported 
  162.      * {@link java.nio.charset.Charset </code>charset<code>} 
  163.      * @return 
  164.      * @throws UnsupportedEncodingException  
  165.      */  
  166.     public static String formatFieldByLeftChar(String str,int size,char charStr,String charsetName) throws UnsupportedEncodingException  
  167.     {  
  168.         byte[] bufferByte = new byte[size];  
  169.         for (int i = 0; i < bufferByte.length; i++)  
  170.         {  
  171.             bufferByte[i] = (byte) charStr;  
  172.         }  
  173.         byte[] strByte    = str.getBytes(charsetName);  
  174.         int strLength     = strByte.length;  
  175.         System.arraycopy(strByte, 0, bufferByte, (size-strLength)>0?(size-strLength):0, (size-strLength)>0?strLength:size);  
  176.         return new String(bufferByte);  
  177.     }  
  178.     /** 
  179.      * @param str 
  180.      * @param size 
  181.      * @param charsetName 
  182.      * @return 
  183.      * @throws UnsupportedEncodingException 
  184.      */  
  185.     public static String formatFieldByLeftChar(String str,int size,String charsetName) throws UnsupportedEncodingException  
  186.     {  
  187.         return formatFieldByLeftChar(str,size,'0',charsetName);  
  188.     }  
  189.       
  190.     public static void main(String args[]){  
  191.         class TestInvode{  
  192.             String cardno;  
  193.             String name;  
  194.             int num;  
  195.             float amount;  
  196.             public String getCardno() {  
  197.                 return cardno;  
  198.             }  
  199.             public void setCardno(String cardno) {  
  200.                 this.cardno = cardno;  
  201.             }  
  202.             public String getName() {  
  203.                 return name;  
  204.             }  
  205.             public void setName(String name) {  
  206.                 this.name = name;  
  207.             }  
  208.             public int getNum() {  
  209.                 return num;  
  210.             }  
  211.             public void setNum(int num) {  
  212.                 this.num = num;  
  213.             }  
  214.             public float getAmount() {  
  215.                 return amount;  
  216.             }  
  217.             public void setAmount(float amount) {  
  218.                 this.amount = amount;  
  219.             }  
  220.         }  
  221.         String requestFormat[][][] =   
  222.          {  
  223.                     {  
  224.                         {"name","cardno"},{"length","16"},{"parameterClass","java.lang.String"}  
  225.                     },  
  226.                     {  
  227.                         {"name","name"},{"length","10"},{"parameterClass","java.lang.String"}  
  228.                     }  
  229.                     ,  
  230.                     {  
  231.                         {"name","num"},{"length","10"},{"parameterClass","int"}  
  232.                     },  
  233.                     {  
  234.                         {"name","amount"},{"length","10"},{"parameterClass","float"}  
  235.                     }  
  236.          };  
  237.         TestInvode ti = new TestInvode();  
  238.         ti.cardno = "4512";  
  239.         ti.name="不告诉你";  
  240.         ti.num = 95;  
  241.         ti.amount=45454.44f;  
  242.         try {  
  243.             System.out.println("######"+javaBeanToFixedLengthPacket(requestFormat, ti, ' ''0'"gb2312"));  
  244.         } catch (Exception e) {  
  245.             e.printStackTrace();  
  246.         }  
  247.         String str = "4512            不告诉你  00000000950045454.44";  
  248.         TestInvode tii = new TestInvode();  
  249.         try {  
  250.             fixedLengthPacketToJavaBean(requestFormat, tii, str,"gb2312");  
  251.         } catch (Exception e) {  
  252.             e.printStackTrace();  
  253.         }  
  254.         System.out.println("######tii.cardno:"+tii.cardno);  
  255.         System.out.println("######tii.name:"+tii.name);  
  256.         System.out.println("######tii.num:"+tii.num);  
  257.         String s = "人";  
  258.         try {  
  259.             System.out.println(s.getBytes("utf-8").length);  
  260.         } catch (UnsupportedEncodingException e) {  
  261.             // TODO Auto-generated catch block  
  262.             e.printStackTrace();  
  263.         }  
  264.         System.out.println(Thread.currentThread().getContextClassLoader());  
  265.         System.out.println(tii.getClass().getClassLoader());  
  266.         System.out.println(ClassLoader.getSystemClassLoader());  
  267.     }  
  268. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值