Title

基于自定义注解将字符串根据自定义长度封装到实体属性

自定义注解

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);
    }
posted @ 2025-06-04 17:31  快乐小洋人  阅读(3)  评论(0)    收藏  举报