自定义注解
import java.lang.annotation.*;
@Target(ElementType.FIELD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface padValWithSpace{
// 开始长度
int start() default 0;
// 结束长度
int end() default 0;
}
将字符串根据自定义长度封装到实体中
/**
* 将字符串转化成实体
* @param report 需要转化的字符串
* @param size 一个循环长度,一个循环为一个实体
* @param clazz 实体
* @return
*/
public List<Object> unPackObjVo(String report, int size, Class clazz) throws Exception {
List<Object> list=new ArrayList<>(0);
// 一个字符串有多个实体值,截取每个实体的字符串进行赋值
for (int i = 0; i < report.length(); i=i+size) {
String cacheStr = report.substring(i, size);
// 判断是否结束
if("END".equals(StrUtil.trim(cacheStr))){
break;
}
// 创建对象
Constructor<?> constructor = clazz.getDeclaredConstructor();
// 突破私有限制
constructor.setAccessible(true);
Object obj=constructor.newInstance();
// 给字段赋值
String value="";
for (Field field : obj.getClass().getDeclaredFields()) {
// 忽略日志
if (field.getType() == org.apache.log4j.Logger.class) {
continue;
}
// 判断是否有该注解,有截取赋值,没有为空
if (field.isAnnotationPresent(PadValWithSpace.class)) {
PadValWithSpace padValWithSpace = field.getAnnotation(PadValWithSpace.class);
int iStart = padValWithSpace.start();
int iEnd=padValWithSpace.end();
value=getValue(cacheStr, iStart, iEnd);
} else {
value = "";
}
// 给字段赋值
Object args[] = null;
String valueTrim=StrUtil.trim(value);
args = new String[]{valueTrim};
PropertyDescriptor pd = new PropertyDescriptor(field.getName(), obj.getClass());
Method writeMethod = pd.getWriteMethod();
writeMethod.invoke(obj, args);
}
list.add(obj);
}
return list;
}
/**
* 返回截取值
* @param tsTmp 需要截取的字符串
* @param start 起始位置
* @param end 结束位置
*/
public String getValue(String tsTmp,int start,int end){
int sLen=tsTmp.length();
if(start>=sLen){
return "";
}
if(end>sLen){
end=sLen;
}
return tsTmp.substring(start,end);
}