开发过程由于经常需要组报文,按一定的协议组成交互数据,报文的数据由多个参数组成,且参数的长度基本都有固定的长度,然后有些协议的参数个数可能达到几十个之多,为了保障数据的完整性,同时又不做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
}
}

到此就可以一劳永逸了,之后所有的数据对象只要在定义的时候就把相关的参数指定长度,那么在之后的实例化之后即可对参数的长度进行校验,可以减少大量的体力活。