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

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