From 1754c21bc849e65299b63b3177b5e9c414352dc6 Mon Sep 17 00:00:00 2001 From: fengshuonan Date: Mon, 21 Dec 2020 21:14:13 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90scanner=E3=80=91=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E5=8F=8D=E5=B0=84=E6=B8=B2=E6=9F=93=E5=90=8D?= =?UTF-8?q?=E7=A7=B0=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/pojo/resource/FieldMetadata.java | 7 ++++ .../resource/api/util/ClassReflectUtil.java | 42 ++++++++++++------- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/kernel-d-scanner/scanner-api/src/main/java/cn/stylefeng/roses/kernel/resource/api/pojo/resource/FieldMetadata.java b/kernel-d-scanner/scanner-api/src/main/java/cn/stylefeng/roses/kernel/resource/api/pojo/resource/FieldMetadata.java index b5aa81f12..7682f0390 100644 --- a/kernel-d-scanner/scanner-api/src/main/java/cn/stylefeng/roses/kernel/resource/api/pojo/resource/FieldMetadata.java +++ b/kernel-d-scanner/scanner-api/src/main/java/cn/stylefeng/roses/kernel/resource/api/pojo/resource/FieldMetadata.java @@ -14,6 +14,13 @@ import java.util.Set; @Data public class FieldMetadata { + /** + * 生成给前端用 + *

+ * uuid,标识一个字段的唯一性 + */ + private String metadataId; + /** * 字段中文名称,例如:创建用户 */ diff --git a/kernel-d-scanner/scanner-api/src/main/java/cn/stylefeng/roses/kernel/resource/api/util/ClassReflectUtil.java b/kernel-d-scanner/scanner-api/src/main/java/cn/stylefeng/roses/kernel/resource/api/util/ClassReflectUtil.java index 822caadaf..5bc2134c1 100644 --- a/kernel-d-scanner/scanner-api/src/main/java/cn/stylefeng/roses/kernel/resource/api/util/ClassReflectUtil.java +++ b/kernel-d-scanner/scanner-api/src/main/java/cn/stylefeng/roses/kernel/resource/api/util/ClassReflectUtil.java @@ -1,6 +1,8 @@ package cn.stylefeng.roses.kernel.resource.api.util; import cn.hutool.core.util.ClassUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.TypeUtil; import cn.stylefeng.roses.kernel.resource.api.annotation.field.ChineseDescription; import cn.stylefeng.roses.kernel.resource.api.pojo.resource.FieldMetadata; import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest; @@ -9,10 +11,7 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; +import java.util.*; /** * 类的反射工具 @@ -32,10 +31,10 @@ public class ClassReflectUtil { */ public static Set getClassFieldDescription(Class clazz) { - HashSet metadataHashSet = new HashSet<>(); + HashSet fieldDescriptions = new HashSet<>(); if (clazz == null) { - return metadataHashSet; + return fieldDescriptions; } // 获取类中的所有字段 @@ -43,19 +42,30 @@ public class ClassReflectUtil { for (Field declaredField : declaredFields) { - FieldMetadata fieldMetadata = new FieldMetadata(); + FieldMetadata fieldDescription = new FieldMetadata(); + + // 生成uuid,给前端用 + fieldDescription.setMetadataId(IdUtil.fastSimpleUUID()); // 获取字段的名称 String name = declaredField.getName(); - fieldMetadata.setFieldName(name); + fieldDescription.setFieldName(name); // 获取字段的类型 Class declaredFieldType = declaredField.getType(); - fieldMetadata.setFieldClassType(declaredFieldType.getSimpleName()); + fieldDescription.setFieldClassType(declaredFieldType.getSimpleName()); // 如果字段类型是Object类型,则遍历Object类型里的字段 if (BaseRequest.class.isAssignableFrom(declaredFieldType)) { - fieldMetadata.setGenericFieldMetadata(getClassFieldDescription(declaredFieldType)); + fieldDescription.setGenericFieldMetadata(getClassFieldDescription(declaredFieldType)); + } + + // 如果是泛型类型,遍历泛泛型的class类型里的字段 + if (Collection.class.isAssignableFrom(declaredFieldType)) { + Class genericClass = TypeUtil.getClass(TypeUtil.getTypeArgument(TypeUtil.getType(declaredField))); + if (BaseRequest.class.isAssignableFrom(genericClass)) { + fieldDescription.setGenericFieldMetadata(getClassFieldDescription(genericClass)); + } } // 获取字段的所有注解 @@ -63,7 +73,7 @@ public class ClassReflectUtil { if (annotations != null && annotations.length > 0) { // 设置字段的所有注解 - fieldMetadata.setAnnotations(annotationsToStrings(annotations)); + fieldDescription.setAnnotations(annotationsToStrings(annotations)); // 遍历字段上的所有注解,找到带groups属性的,按group分类组装注解 Map> groupAnnotations = new HashMap<>(); @@ -76,19 +86,19 @@ public class ClassReflectUtil { } } // 设置分组注解 - fieldMetadata.setGroupAnnotations(groupAnnotations); + fieldDescription.setGroupAnnotations(groupAnnotations); // 填充字段的中文名称 ChineseDescription chineseDescription = declaredField.getAnnotation(ChineseDescription.class); if (chineseDescription != null) { - fieldMetadata.setChineseName(chineseDescription.value()); + fieldDescription.setChineseName(chineseDescription.value()); } } - metadataHashSet.add(fieldMetadata); + fieldDescriptions.add(fieldDescription); } - return metadataHashSet; + return fieldDescriptions; } /** @@ -149,4 +159,4 @@ public class ClassReflectUtil { return strings; } -} +} \ No newline at end of file