1. 程式人生 > >java使用註解校驗物件屬性值資料長度

java使用註解校驗物件屬性值資料長度

開發過程由於經常需要組報文,按一定的協議組成互動資料,報文的資料由多個引數組成,且引數的長度基本都有固定的長度,然後有些協議的引數個數可能達到幾十個之多,為了保障資料的完整性,同時又不做if(data.length())這樣大量的體力活,這裡介紹一種使用註解來完成這個校驗的動作。

定義註解

@Target({ ElementType.FIELD, ElementType.TYPE })
@Inherited
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface DataLen
{
    int value();
}

定義校驗引數長度的幫助類

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;

/**
 * 校驗資料長度的幫助類
 * 
 * @author lupf
 * 
 */
public class DataLenCheckHelper
{
    /**
     * 校驗資料屬性至
     * 
     * @param obj
     * @throws Exception
     */
    @SuppressWarnings("rawtypes")
    public static
void checkAttributeValueLen(Object obj) throws Exception { if (null != obj) { // 得到class Class cls = obj.getClass(); System.out.println("校驗物件中引數的資料長度是否符合要求,校驗物件:" + cls.getName()); // 得到所有屬性 Field[] fields = cls.getDeclaredFields(); for
(int i = 0; i < fields.length; i++) {// 遍歷 try { // 得到屬性 Field field = fields[i]; Annotation[] anns = field.getAnnotations(); DataLen dataLen = null; for (Annotation ann : anns) { if (ann instanceof DataLen) dataLen = (DataLen) ann; } // 判斷該屬性是否有校驗資料長度的註解 if (null != dataLen) { // 開啟私有訪問 field.setAccessible(true); // 獲取屬性 String name = field.getName(); // 獲取屬性值 Object value = field.get(obj); // 指定的長度 int len = dataLen.value(); // 資料的長度 int vaLen = 0; String data = null; // 一個個賦值 if (null != value && value instanceof String) { data = (String) value; vaLen = data.length(); } if (vaLen != len) { System.out.print("物件:" + cls.getName() + "中存在不符合條件的引數,引數名:" + name + "引數值:" + data + "指定的資料長度:" + len + "實際長度:" + vaLen + "不符合條件"); throw new Exception(); } } } catch (IllegalAccessException e) { e.printStackTrace(); } } } } }

測試

  • 定義測試類

    public class TestObj
    {
    @DataLen(5)
    public String data1;
    
    @DataLen(10)
    public String data2;
    
    public TestObj(String data1, String data2)
    {
        this.data1 = data1;
        this.data2 = data2;
    }
    }
  • main方法測試

    • 正常

          public static void main(String[] args)
          {
              try
              {
                  TestObj testObj = new TestObj("12345", "1122334455");
                  DataLenCheckHelper.checkAttributeValueLen(testObj);
              }
              catch (Exception e)
              {
                  // TODO Auto-generated catch block
              }
      
          }

    • 異常

          public static void main(String[] args)
          {
              try
              {
                  TestObj testObj = new TestObj("123456", "1122334455");
                  DataLenCheckHelper.checkAttributeValueLen(testObj);
              }
              catch (Exception e)
              {
                  // TODO Auto-generated catch block
              }
      
          }

到此就可以一勞永逸了,之後所有的資料物件只要在定義的時候就把相關的引數指定長度,那麼在之後的例項化之後即可對引數的長度進行校驗,可以減少大量的體力活。