From 89c9b3b19c4251597cc0c0a42bf88c3d9db16f96 Mon Sep 17 00:00:00 2001 From: aoshiguchen <1052045476@qq.com> Date: Sat, 18 Jun 2022 19:10:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=86=85=E9=83=A8=E7=B1=BB=E5=9E=8B=E8=BD=AC?= =?UTF-8?q?=E6=8D=A2=E6=89=A9=E5=B1=95=EF=BC=8C=E5=A2=9E=E5=8A=A0=E9=9B=86?= =?UTF-8?q?=E5=90=88=E4=B8=8E=E6=95=B0=E7=BB=84=E4=B9=8B=E9=97=B4=E7=9A=84?= =?UTF-8?q?=E8=BD=AC=E6=8D=A2=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../asgc/neutrino/core/type/TypeMatchers.java | 52 ++++++ .../fun/asgc/neutrino/core/util/TypeUtil.java | 172 ------------------ .../asgc/neutrino/core/util/TypeUtilTest.java | 25 +++ 3 files changed, 77 insertions(+), 172 deletions(-) diff --git a/neutrino-core/src/main/java/fun/asgc/neutrino/core/type/TypeMatchers.java b/neutrino-core/src/main/java/fun/asgc/neutrino/core/type/TypeMatchers.java index 098b2818..43ccef66 100644 --- a/neutrino-core/src/main/java/fun/asgc/neutrino/core/type/TypeMatchers.java +++ b/neutrino-core/src/main/java/fun/asgc/neutrino/core/type/TypeMatchers.java @@ -18,6 +18,9 @@ import fun.asgc.neutrino.core.util.TypeUtil; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * @@ -176,6 +179,55 @@ public class TypeMatchers { return matchInfo; } }); + // Object[] -> List + extensionMatcherList.add(new TypeMatcher() { + @Override + public TypeMatchInfo match(Class clazz, Class targetClass) { + TypeMatchInfo matchInfo = new TypeMatchInfo(clazz, targetClass, this); + if (List.class == targetClass && clazz.isArray()) { + matchInfo.setTypeDistance(TypeMatchLevel.EXTENSION.getDistanceMin() + 40); + matchInfo.setTypeConverter(((value, targetType) -> Stream.of((Object[])value).collect(Collectors.toList()))); + } + return matchInfo; + } + }); + // List -> Object[] + extensionMatcherList.add(new TypeMatcher() { + @Override + public TypeMatchInfo match(Class clazz, Class targetClass) { + TypeMatchInfo matchInfo = new TypeMatchInfo(clazz, targetClass, this); + if (List.class.isAssignableFrom(clazz) && targetClass.isArray()) { + matchInfo.setTypeDistance(TypeMatchLevel.EXTENSION.getDistanceMin() + 50); + matchInfo.setTypeConverter((value, targetType) -> ((List)value).toArray()); + } + return matchInfo; + } + }); + // Object[] -> Set + extensionMatcherList.add(new TypeMatcher() { + @Override + public TypeMatchInfo match(Class clazz, Class targetClass) { + TypeMatchInfo matchInfo = new TypeMatchInfo(clazz, targetClass, this); + if (Set.class == targetClass && clazz.isArray()) { + matchInfo.setTypeDistance(TypeMatchLevel.EXTENSION.getDistanceMin() + 60); + matchInfo.setTypeConverter(((value, targetType) -> Stream.of((Object[])value).collect(Collectors.toSet()))); + } + return matchInfo; + } + }); + // Set -> Object[] + extensionMatcherList.add(new TypeMatcher() { + @Override + public TypeMatchInfo match(Class clazz, Class targetClass) { + TypeMatchInfo matchInfo = new TypeMatchInfo(clazz, targetClass, this); + if (Set.class.isAssignableFrom(clazz) && targetClass.isArray()) { + matchInfo.setTypeDistance(TypeMatchLevel.EXTENSION.getDistanceMin() + 70); + matchInfo.setTypeConverter((value, targetType) -> ((Set)value).toArray()); + } + return matchInfo; + } + }); + } /** diff --git a/neutrino-core/src/main/java/fun/asgc/neutrino/core/util/TypeUtil.java b/neutrino-core/src/main/java/fun/asgc/neutrino/core/util/TypeUtil.java index 582c30b1..8aaebe8c 100644 --- a/neutrino-core/src/main/java/fun/asgc/neutrino/core/util/TypeUtil.java +++ b/neutrino-core/src/main/java/fun/asgc/neutrino/core/util/TypeUtil.java @@ -27,7 +27,6 @@ import fun.asgc.neutrino.core.type.TypeMatchInfo; import fun.asgc.neutrino.core.type.TypeMatchers; import java.lang.reflect.Field; -import java.lang.reflect.Method; import java.util.*; /** @@ -476,121 +475,9 @@ public class TypeUtil { public static TypeMatchInfo typeMatch(Class fieldType, Class valueType) { Assert.notNull(fieldType, "字段类型不能为空!"); Assert.notNull(valueType, "值类型不能为空!"); - -// // 1、完全匹配 -// if (fieldType == valueType) { -// return new TypeMatchInfo(fieldType, valueType, TypeDistance.PERFECT); -// } -// // 2、包装匹配 -// if (isStrictBasicType(valueType) && getWrapType(valueType) == fieldType) { -// return new TypeMatchInfo(fieldType, valueType, TypeDistance.PACKING); -// } -// // 3、解包装匹配 -// if (isStrictBasicType(fieldType) && getWrapType(fieldType) == valueType) { -// return new TypeMatchInfo(fieldType, valueType, TypeDistance.UNPACKING); -// } -// // 4、类型提升 -// if (isNormalBasicType(fieldType) && isNormalBasicType(valueType)) { -// int index1 = basicTypeList.indexOf(fieldType); -// int index2 = basicTypeList.indexOf(valueType); -// if (index1 > index2 && index2 > 0) { -// return new TypeMatchInfo(fieldType, valueType, TypeDistance.ASCENSION_MIN + (index1 - index2) - 1); -// } -// } -// // 5、超类匹配 -// if (fieldType.isAssignableFrom(valueType)) { -// int inheritLevel = getInheritLevel(fieldType, valueType); -// if (-1 == inheritLevel) { -// throw new RuntimeException(String.format("超类匹配异常! fieldType:%s valueType:%s", fieldType.getName(), valueType.getName())); -// } -// return new TypeMatchInfo(fieldType, valueType, TypeDistance.SUPER_MIN + inheritLevel - 1); -// } -// // 6、自定义转换 -// if (fieldType == Date.class || fieldType == java.sql.Date.class) { -// if (valueType == long.class) { -// return new TypeMatchInfo(fieldType, valueType, TypeDistance.CUSTOM_MIN); -// } else if (valueType == long.class) { -// return new TypeMatchInfo(fieldType, valueType, TypeDistance.CUSTOM_MIN + 1); -// } -// } -// if (fieldType == Long.class || fieldType == long.class) { -// if (valueType == Date.class) { -// return new TypeMatchInfo(fieldType, valueType, TypeDistance.CUSTOM_MIN + 1000); -// } else if (valueType == java.sql.Date.class) { -// return new TypeMatchInfo(fieldType, valueType, TypeDistance.CUSTOM_MIN + 1001); -// } -// } -// if (fieldType == String.class) { -// if (valueType == char.class) { -// return new TypeMatchInfo(fieldType, valueType, TypeDistance.CUSTOM_MIN + 2000); -// } else if (valueType == Character.class) { -// return new TypeMatchInfo(fieldType, valueType, TypeDistance.CUSTOM_MIN + 2001); -// } else if (Number.class.isAssignableFrom(valueType)) { -// return new TypeMatchInfo(fieldType, valueType, TypeDistance.CUSTOM_MIN + 2002); -// } -// } -// if (Iterable.class.isAssignableFrom(fieldType) && Iterable.class.isAssignableFrom(valueType)) { -// return new TypeMatchInfo(fieldType, valueType, TypeDistance.CUSTOM_MIN + 3000); -// } -// if (Iterable.class.isAssignableFrom(fieldType) && String[].class == valueType) { -// return new TypeMatchInfo(fieldType, valueType, TypeDistance.CUSTOM_MIN + 4000); -// } -// if (Iterable.class.isAssignableFrom(valueType) && String[].class == fieldType) { -// return new TypeMatchInfo(fieldType, valueType, TypeDistance.CUSTOM_MIN + 5000); -// } -// if (Iterable.class.isAssignableFrom(fieldType) && Integer[].class == valueType) { -// return new TypeMatchInfo(fieldType, valueType, TypeDistance.CUSTOM_MIN + 6000); -// } -// if (Iterable.class.isAssignableFrom(valueType) && Integer[].class == fieldType) { -// return new TypeMatchInfo(fieldType, valueType, TypeDistance.CUSTOM_MIN + 7000); -// } - return new TypeMatchInfo(fieldType, valueType, null); } - /** - * 类型提升 - * @param value - * @param clazz - * @return - */ - public static Object ascensionType(Object value, Class clazz) { - Class valueType = value.getClass(); - int index1 = basicTypeList.indexOf(valueType); - int index2 = basicTypeList.indexOf(clazz); - if (-1 == index1 || -1 == index2 || index1 >= index2) { - return value; - } - if (getWrapType(valueType) == clazz || getWrapType(clazz) == valueType) { - return value; - } - if (isChar(clazz)) { - return value; - } - String strValue; - if (isBoolean(valueType)) { - strValue = ((Boolean)value) ? "0" : "1"; - } else if (isChar(valueType)){ - strValue = (int)((Character)value) + ""; - } else { - strValue = String.valueOf(value); - } - if (isBoolean(clazz)) { - return "0".equals(strValue); - } - Method method = ReflectUtil.getValueOfMethod(clazz, String.class); - if (null == method) { - return value; - } - - try { - return method.invoke(null, strValue); - } catch (Exception e) { - // ignore - } - return value; - } - /** * 类型转换 * @param value @@ -600,63 +487,4 @@ public class TypeUtil { public static Object conversion(Object value, Class targetType) { return defaultTypeMatchers.conversion(value, targetType); } - -// /** -// * 类型转换 -// * @param value -// * @param targetType -// * @return -// */ -// public static Object conversion(Object value, Class targetType) { -// Assert.notNull(targetType, "目标类型不能为空!"); -// if (null == value) { -// return null; -// } -// Class valueType = value.getClass(); -// TypeMatchInfo matchingInfo = typeMatch(targetType, valueType); -// if (matchingInfo.isNotMatch()) { -// return null; -// } -// // 类型提升 -// if (matchingInfo.getTypeDistance() <= TypeDistance.ASCENSION_MAX) { -// return TypeUtil.ascensionType(value, targetType); -// } -// // 超类 -// if (matchingInfo.getTypeDistance() <= TypeDistance.SUPER_MAX) { -// return value; -// } -// if (matchingInfo.getTypeDistance() >= TypeDistance.CUSTOM_MIN && matchingInfo.getTypeDistance() <= TypeDistance.CUSTOM_MAX) { -// // 自定义转换 -// if (targetType == Date.class) { -// if (valueType == long.class || value == Long.class) { -// return new Date((Long) value); -// } -// } else if (targetType == java.sql.Date.class) { -// if (valueType == long.class || value == Long.class) { -// return new java.sql.Date((Long) value); -// } -// } else if (targetType == Long.class || targetType == long.class) { -// if (valueType == java.sql.Date.class || valueType == Date.class) { -// return ((Date) value).getTime(); -// } -// } else if (targetType == String.class) { -// if (valueType == char.class || valueType == Character.class || Number.class.isAssignableFrom(valueType)) { -// return String.valueOf(value); -// } -// } else if (Iterable.class.isAssignableFrom(targetType) && Iterable.class.isAssignableFrom(valueType)) { -// if (Set.class.isAssignableFrom(targetType)) { -// return Sets.newHashSet((Iterable) value); -// } -// } else if (Iterable.class.isAssignableFrom(valueType) && String[].class == targetType) { -// if (List.class.isAssignableFrom(valueType)) { -// return ((List) value).stream().map(String::valueOf).collect(Collectors.toList()).toArray(new String[]{}); -// } -// } else if (Iterable.class.isAssignableFrom(valueType) && Integer[].class == targetType) { -// if (List.class.isAssignableFrom(valueType)) { -// return ((List) value).stream().map(String::valueOf).map(Integer::valueOf).collect(Collectors.toList()).toArray(new Integer[]{}); -// } -// } -// } -// return null; -// } } diff --git a/neutrino-core/src/test/java/fun/asgc/neutrino/core/util/TypeUtilTest.java b/neutrino-core/src/test/java/fun/asgc/neutrino/core/util/TypeUtilTest.java index ed2349de..99360ed2 100644 --- a/neutrino-core/src/test/java/fun/asgc/neutrino/core/util/TypeUtilTest.java +++ b/neutrino-core/src/test/java/fun/asgc/neutrino/core/util/TypeUtilTest.java @@ -12,11 +12,15 @@ */ package fun.asgc.neutrino.core.util; +import com.google.common.collect.Lists; import fun.asgc.neutrino.core.type.*; import lombok.Data; import lombok.experimental.Accessors; import org.junit.Test; +import java.util.List; +import java.util.Set; + /** * * @author: wen.y @@ -80,6 +84,7 @@ public class TypeUtilTest { System.out.println(typeMatchers.conversion(null, Float.class)); System.out.println(typeMatchers.conversion(null, Double.class)); System.out.println(typeMatchers.conversion(null, String.class)); + System.out.println(typeMatchers.conversion(null, List.class)); System.out.println(typeMatchers.conversion(null, Animal.class)); System.out.println(typeMatchers.conversion(null, Cat.class)); @@ -107,6 +112,19 @@ public class TypeUtilTest { System.out.println(typeMatchers.conversion("aabb", Animal.class)); System.out.println(typeMatchers.conversion("aabb:10", Cat.class)); + + System.out.println(typeMatchers.conversion(new String[]{"11","22","33","22"}, List.class)); + System.out.println(typeMatchers.conversion(new Integer[]{10, 20, 30,20}, List.class)); + System.out.println(typeMatchers.conversion(new Boolean[]{true, true, false}, List.class)); + System.out.println(typeMatchers.conversion(new Animal[]{new Animal("aa"), new Animal("bb"), new Animal("cc"),}, List.class)); + + + System.out.println(typeMatchers.conversion(Lists.newArrayList("11","22","33","22"), Object[].class)); + + System.out.println(typeMatchers.conversion(new String[]{"11","22","33","22"}, Set.class)); + System.out.println(typeMatchers.conversion(new Integer[]{10, 20, 30,20}, Set.class)); + System.out.println(typeMatchers.conversion(new Boolean[]{true, true, false}, Set.class)); + } @Test @@ -130,6 +148,7 @@ public class TypeUtilTest { System.out.println(typeMatchers.conversion(114, Float.class)); System.out.println(typeMatchers.conversion(115, Double.class)); System.out.println(typeMatchers.conversion(116, String.class)); + System.out.println(typeMatchers.conversion(200, List.class)); System.out.println(typeMatchers.conversion(117, Animal.class)); System.out.println(typeMatchers.conversion(118, Cat.class)); @@ -140,6 +159,12 @@ public class TypeUtilTest { @Data public static class Animal { private String name; + public Animal() { + + } + public Animal(String name) { + this.name = name; + } } @Accessors(chain = true)