【8.3.0】【scanner】整理class类型解析的过程

pull/62/head
stylefeng 2024-08-06 23:34:05 +08:00
parent 44ace2c100
commit 51f529376a
2 changed files with 44 additions and 38 deletions

View File

@ -1,7 +1,9 @@
package cn.stylefeng.roses.kernel.rule.pojo.clazz; package cn.stylefeng.roses.kernel.rule.pojo.clazz;
import cn.stylefeng.roses.kernel.rule.enums.FieldTypeEnum; import cn.stylefeng.roses.kernel.rule.enums.FieldTypeEnum;
import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
import java.lang.reflect.Type; import java.lang.reflect.Type;
@ -12,6 +14,8 @@ import java.lang.reflect.Type;
* @since 2024/8/6 21:49 * @since 2024/8/6 21:49
*/ */
@Data @Data
@AllArgsConstructor
@NoArgsConstructor
public class ClassParseResult { public class ClassParseResult {
/** /**

View File

@ -2,6 +2,7 @@ package cn.stylefeng.roses.kernel.rule.util;
import cn.hutool.core.util.ClassUtil; import cn.hutool.core.util.ClassUtil;
import cn.stylefeng.roses.kernel.rule.enums.FieldTypeEnum; import cn.stylefeng.roses.kernel.rule.enums.FieldTypeEnum;
import cn.stylefeng.roses.kernel.rule.pojo.clazz.ClassParseResult;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.lang.reflect.ParameterizedType; import java.lang.reflect.ParameterizedType;
@ -10,21 +11,23 @@ import java.util.Collection;
import java.util.Map; import java.util.Map;
/** /**
* * class
* <p>
*
* *
* @author fengshuonan * @author fengshuonan
* @since 2022/1/14 16:42 * @since 2024/8/6 21:48
*/ */
@Slf4j @Slf4j
public class ClassTypeUtil { public class ClassTypeUtil {
/** /**
* *
* *
* @author fengshuonan * @author fengshuonan
* @since 2022/1/14 0:25 * @since 2024/8/6 21:49
*/ */
public static FieldTypeEnum getClassFieldType(Type type) { public static ClassParseResult getClassFieldType(Type type) {
// 如果是具体类,不带泛型 // 如果是具体类,不带泛型
if (type instanceof Class) { if (type instanceof Class) {
@ -33,34 +36,31 @@ public class ClassTypeUtil {
// 判断是否是基本类型如果是Map或者Object也认定为基本类型不解析他们的字段 // 判断是否是基本类型如果是Map或者Object也认定为基本类型不解析他们的字段
if (ClassUtil.isSimpleValueType(clazz)) { if (ClassUtil.isSimpleValueType(clazz)) {
return FieldTypeEnum.BASIC; return new ClassParseResult(FieldTypeEnum.BASIC, null);
} }
// 判断是否是数组类型 // 判断是否是数组类型
else if (clazz.isArray()) { else if (clazz.isArray()) {
// 获取array的具体类型 // 获取array的具体类型
Class<?> componentType = clazz.getComponentType(); Class<?> componentType = clazz.getComponentType();
if (ClassUtil.isSimpleValueType(componentType)) { return new ClassParseResult(FieldTypeEnum.ARRAY, componentType);
return FieldTypeEnum.BASE_ARRAY;
} else {
return FieldTypeEnum.ARRAY_WITH_OBJECT;
}
} }
// 如果是集合类型,纯集合类型,不带泛型 // 如果是集合类型,纯集合类型,不带泛型
else if (Collection.class.isAssignableFrom(clazz)) { else if (Collection.class.isAssignableFrom(clazz)) {
return FieldTypeEnum.BASE_COLLECTION; return new ClassParseResult(FieldTypeEnum.COLLECTION, null);
} }
// 如果是Object类型则认定为基本类型不解析他的具体内容 // 如果是Object类型则认定为基本类型不解析他的具体内容
else if (Object.class.equals(clazz)) { // 【注意】如果是解析具体实体类型用AdvancedClassTypeUtil类
return FieldTypeEnum.BASIC; else if (Object.class.isAssignableFrom(clazz)) {
return new ClassParseResult(FieldTypeEnum.OBJECT, null);
} }
// 其他类型,暂不处理 // 其他类型,暂不处理
else { else {
log.debug("类型是Class但有处理不到的情况打印出类的信息如下{}", clazz.toGenericString()); log.debug("类型是Class但有处理不到的情况打印出类的信息如下{}", clazz.toGenericString());
return FieldTypeEnum.OTHER; return new ClassParseResult(FieldTypeEnum.OTHER, null);
} }
} }
@ -69,43 +69,45 @@ public class ClassTypeUtil {
ParameterizedType parameterizedType = (ParameterizedType) type; ParameterizedType parameterizedType = (ParameterizedType) type;
// 泛型的主体 // 泛型的主体,例如 List<String>主体是List
Type rawType = parameterizedType.getRawType(); Class<?> rawTypeClass = (Class<?>) parameterizedType.getRawType();
if (rawType instanceof Class<?>) { // 泛型的类型,例如 List<String>类型是String
Class<?> rawTypeClass = (Class<?>) rawType; Type actualTypeArgument = parameterizedType.getActualTypeArguments()[0];
// 如果泛型主体是集合 // 如果泛型主体是集合
if (Collection.class.isAssignableFrom(rawTypeClass)) { if (Collection.class.isAssignableFrom(rawTypeClass)) {
return FieldTypeEnum.COLLECTION_WITH_OBJECT; return new ClassParseResult(FieldTypeEnum.COLLECTION, actualTypeArgument);
} }
// 如果是map类型则认定为基本类型不做处理不解析他的元数据 // 如果是map类型则认定为基本类型不做处理不解析他的元数据
else if (Map.class.isAssignableFrom(rawTypeClass)) { else if (Map.class.isAssignableFrom(rawTypeClass)) {
return FieldTypeEnum.BASIC; return new ClassParseResult(FieldTypeEnum.BASIC, null);
}
// 如果是Object类型则认定为基本类型不解析他的具体内容
// 【注意】如果是解析具体实体类型用AdvancedClassTypeUtil类
else if (Object.class.isAssignableFrom(rawTypeClass)) {
return new ClassParseResult(FieldTypeEnum.OBJECT_WITH_GENERIC, actualTypeArgument);
} }
// 泛型的主体情况不确定,不处理 // 泛型的主体情况不确定,不处理
else { else {
log.debug("泛型的主体情况不确定不处理打印出rawTypeClass{}", rawTypeClass.getName()); log.debug("泛型的主体情况不确定不处理打印出rawTypeClass{}", rawTypeClass.getName());
return FieldTypeEnum.OTHER; return new ClassParseResult(FieldTypeEnum.OTHER, null);
}
} else {
// 泛型的主体是别的类型
log.debug("rawType为非Class类型打印出rawType{}", rawType.getTypeName());
return FieldTypeEnum.OTHER;
} }
} }
// 带T的参数例如解析到ResponseData<T>中的data字段就是这种情况 // 带T的参数例如解析到ResponseData<T>中的data字段就是这种情况
// 这种情况单纯从参数中是拿不到T的需要从外部的参数中获取T的类型
else if (type.getTypeName().equals("T")) { else if (type.getTypeName().equals("T")) {
return FieldTypeEnum.WITH_UNKNOWN_GENERIC; return new ClassParseResult(FieldTypeEnum.WITH_UNKNOWN_GENERIC, null);
} }
// 其他情况既不是class也不是ParameterizedType // 其他情况既不是class也不是ParameterizedType
else { else {
log.debug("未知类型的处理既不是class也不是ParameterizedType打印出类的信息如下{}", type.getTypeName()); log.debug("未知类型的处理既不是class也不是ParameterizedType打印出类的信息如下{}", type.getTypeName());
return FieldTypeEnum.OTHER; return new ClassParseResult(FieldTypeEnum.OTHER, null);
} }
} }