java使用註解校驗物件屬性值資料長度
阿新 • • 發佈:2019-01-08
開發過程由於經常需要組報文,按一定的協議組成互動資料,報文的資料由多個引數組成,且引數的長度基本都有固定的長度,然後有些協議的引數個數可能達到幾十個之多,為了保障資料的完整性,同時又不做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 } }
到此就可以一勞永逸了,之後所有的資料物件只要在定義的時候就把相關的引數指定長度,那麼在之後的例項化之後即可對引數的長度進行校驗,可以減少大量的體力活。