From deee61074bffb9ab505b19fb9f1f29b39198d977 Mon Sep 17 00:00:00 2001 From: quyixiao <2621048238@qq.com> Date: Fri, 22 Jan 2021 11:22:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/lz/common/annotation/TaskHeader.java | 3 + .../com/lz/modules/app/dto/ResultDto.java | 33 +++-- .../modules/third/utils/TaskConvertUtils.java | 130 ++++++++++++++++++ 3 files changed, 153 insertions(+), 13 deletions(-) create mode 100644 src/main/java/com/lz/modules/third/utils/TaskConvertUtils.java diff --git a/src/main/java/com/lz/common/annotation/TaskHeader.java b/src/main/java/com/lz/common/annotation/TaskHeader.java index f1ee62f5..92d78341 100644 --- a/src/main/java/com/lz/common/annotation/TaskHeader.java +++ b/src/main/java/com/lz/common/annotation/TaskHeader.java @@ -8,4 +8,7 @@ import java.lang.annotation.*; public @interface TaskHeader { String value ( ) default ""; + + + int order() default 0; } diff --git a/src/main/java/com/lz/modules/app/dto/ResultDto.java b/src/main/java/com/lz/modules/app/dto/ResultDto.java index 28280ff5..7d14db6d 100644 --- a/src/main/java/com/lz/modules/app/dto/ResultDto.java +++ b/src/main/java/com/lz/modules/app/dto/ResultDto.java @@ -1,38 +1,45 @@ package com.lz.modules.app.dto; +import com.alibaba.fastjson.JSON; import com.lz.common.annotation.TaskHeader; +import com.lz.modules.app.utils.t.Tuple; +import com.lz.modules.app.utils.t.TwoTuple; import lombok.Data; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Comparator; import java.util.List; @Data public class ResultDto { - @TaskHeader("index") - private int index; - @TaskHeader("id") + @TaskHeader(value = "index", order = 0) + private Integer index; + @TaskHeader(value = "id", order = 1) private Long id; - @TaskHeader("内容") + @TaskHeader(value = "内容", order = 2) private String content; - @TaskHeader("进度") //返回值如30%, 如果没有可以不填写 + @TaskHeader(value = "进度", order = 3) //返回值如30%, 如果没有可以不填写 private String rate; public ResultDto() { } - public ResultDto(@TaskHeader("索引") int index, @TaskHeader("Id") Long id, @TaskHeader("内容") String content) { + public ResultDto(@TaskHeader("索引") Integer index, @TaskHeader("Id") Long id, @TaskHeader("内容") String content) { this.index = index; this.id = id; this.content = content; } - public static void main(String[] args) { - ResultDto resultDto1 = new ResultDto(0,10l,"哈哈0"); - ResultDto resultDto2 = new ResultDto(1,11l,"哈哈1"); - ResultDto resultDto3 = new ResultDto(2,12l,"哈哈2"); - ResultDto resultDto4 = new ResultDto(3,13l,"哈哈3"); - ResultDto [] array = new ResultDto[]{resultDto1,resultDto2,resultDto3,resultDto4}; - List resultDtos = Arrays.asList(array); + + public ResultDto(@TaskHeader("index") Integer index, @TaskHeader("id") Long id, @TaskHeader("内容") String content, @TaskHeader("进度") String rate) { + this.index = index; + this.id = id; + this.content = content; + this.rate = rate; } + } diff --git a/src/main/java/com/lz/modules/third/utils/TaskConvertUtils.java b/src/main/java/com/lz/modules/third/utils/TaskConvertUtils.java new file mode 100644 index 00000000..576c09e6 --- /dev/null +++ b/src/main/java/com/lz/modules/third/utils/TaskConvertUtils.java @@ -0,0 +1,130 @@ +package com.lz.modules.third.utils; + +import com.alibaba.fastjson.JSON; +import com.lz.common.annotation.TaskHeader; +import com.lz.modules.app.dto.ResultDto; +import com.lz.modules.app.utils.t.Tuple; +import com.lz.modules.app.utils.t.TwoTuple; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; + +public class TaskConvertUtils { + + public static Tuple convert(List resultDtos) throws Exception { + Field[] fields = sortFields(ResultDto.class.getDeclaredFields()); + List header = new ArrayList<>(); + for (Field field : fields) { + TaskHeader taskHeader = field.getAnnotation(TaskHeader.class); + header.add(taskHeader.value()); + } + Method[] methodLengths = sortMethods(ResultDto.class.getMethods()); + boolean[] indexs = new boolean[methodLengths.length]; + List> data = new ArrayList<>(); + for (ResultDto resultDto : resultDtos) { + Method[] methods = methodLengths; + List methodValueList = new ArrayList<>(); + for (int i = 0; i < methods.length; i++) { + String methodName = methods[i].getName(); + if (!methodName.equals("getId")) { + Object object = methods[i].invoke(resultDto, null); + if (object != null && object != "") { + indexs[i] = true; + methodValueList.add(object + ""); + } + } + } + data.add(methodValueList); + } + for (int i = 0; i < indexs.length; i++) { + if (!indexs[i]) { + header.remove(i); + } + } + + return new Tuple(header, data); + } + + + public static Field[] sortFields(Field[] fields) { + // 用来存放所有的属性域 + List fieldList = new ArrayList<>(); + // 过滤带有注解的Field + for (Field f : fields) { + if (f.getAnnotation(TaskHeader.class) != null) { + fieldList.add(f); + } + } + // 这个比较排序的语法依赖于java 1.8 + fieldList.sort(Comparator.comparingInt( + f -> f.getAnnotation(TaskHeader.class).order() + )); + return fieldList.toArray(new Field[fieldList.size()]); + } + + public static String captureName(String name) { + char[] cs = name.toCharArray(); + cs[0] += 32; + return String.valueOf(cs); + } + + + public static Method[] sortMethods(Method[] methods) { + // 用来存放所有的属性域 + List methodList = new ArrayList<>(); + // 过滤带有注解的Field + for (Method m : methods) { + String mname = m.getName(); + if ((mname.startsWith("get") || mname.startsWith("Get")) && !"getClass".equals(m.getName())) { + Class clas = m.getDeclaringClass(); + String a = mname.substring(3); + a = captureName(a); + try { + Field field = clas.getDeclaredField(a); + if (field.getAnnotation(TaskHeader.class) != null) { + methodList.add(m); + } + } catch (Exception e) { + e.printStackTrace(); + continue; + } + } + + } + // 这个比较排序的语法依赖于java 1.8 + methodList.sort(Comparator.comparingInt( + m -> { + String mname = m.getName(); + Class clas = m.getDeclaringClass(); + String a = mname.substring(3); + a = captureName(a); + try { + Field field = clas.getDeclaredField(a); + int sort = field.getAnnotation(TaskHeader.class).order(); + return sort; + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } + return 9999; + } + )); + return methodList.toArray(new Method[methodList.size()]); + } + + public static void main(String[] args) throws Exception { + ResultDto resultDto1 = new ResultDto(0, 10l, "哈哈0"); + ResultDto resultDto2 = new ResultDto(1, 11l, "哈哈1"); + ResultDto resultDto3 = new ResultDto(2, 12l, "哈哈2"); + ResultDto resultDto4 = new ResultDto(3, 13l, "哈哈3", "30%"); + ResultDto[] array = new ResultDto[]{resultDto1, resultDto2, resultDto3, resultDto4}; + List resultDtos = Arrays.asList(array); + TwoTuple, List>> data = convert(resultDtos).getData(); + System.out.println(JSON.toJSONString(data.getFirst())); + System.out.println(JSON.toJSONString(data.getSecond())); + + } +}