This commit is contained in:
Looly 2020-09-05 18:00:25 +08:00
parent dba35b9395
commit cbbf4671ba
4 changed files with 81 additions and 51 deletions

View File

@ -3,7 +3,7 @@
-------------------------------------------------------------------------------------------------------------
# 5.4.2 (2020-09-03)
# 5.4.2 (2020-09-05)
### 新特性
* 【core 】 lock放在try外边pr#1050@Github
@ -14,11 +14,13 @@
* 【poi 】 RowUtil增加插入和删除行pr#1060@Github
* 【extra 】 SpringUtil增加注册beanpr#174@Gitee
* 【core 】 修改NetUtil.getMacAddress避免空指针issue#1057@Github
* 【core 】 增加EnumItem接口枚举扩展转换增加SPI自定义转换pr#173@Gitee
* 【core 】 增加EnumItem接口枚举扩展转换增加SPI自定义转换pr#173@Github
* 【core 】 TypeUtil增加getActualTypeMap方法
### Bug修复#
### Bug修复
* 【core 】 重新整理农历节假日解决一个pr过来的玩笑导致的问题
* 【poi 】 修复ExcelFileUtil.isXls判断问题pr#1055@Github
* 【poi 】 修复CglibUtil.copyList参数错误导致的问题
-------------------------------------------------------------------------------------------------------------
@ -40,7 +42,6 @@
* 【core 】 EnumUtil.getEnumAt负数返回nullpr#167@Gitee
* 【core 】 ChineseDate增加天干地支和转换为公历方法pr#169@Gitee
* 【core 】 Img增加stroke描边方法issue#1033@Github
* 【core 】 TypeUtil增加getActualTypeMap方法
### Bug修复#
* 【poi 】 修复ExcelBase.isXlsx方法判断问题issue#I1S502@Gitee

View File

@ -61,6 +61,18 @@ public class TypeUtil {
return field.getGenericType();
}
/**
* 获得字段的泛型类型
*
* @param clazz Bean类
* @param fieldName 字段名
* @return 字段的泛型类型
* @since 5.4.2
*/
public static Type getFieldType(Class<?> clazz, String fieldName) {
return getType(ReflectUtil.getField(clazz, fieldName));
}
/**
* 获得Field对应的原始类
*
@ -73,6 +85,7 @@ public class TypeUtil {
}
// ----------------------------------------------------------------------------------- Param Type
/**
* 获取方法的第一个参数类型<br>
* 优先获取方法的GenericParameterTypes如果获取不到则获取ParameterTypes
@ -147,7 +160,6 @@ public class TypeUtil {
*
* @param method t方法
* @return 参数类型类列表
*
* @see Method#getGenericParameterTypes
* @see Method#getParameterTypes
* @since 3.1.2
@ -157,6 +169,7 @@ public class TypeUtil {
}
// ----------------------------------------------------------------------------------- Return Type
/**
* 获取方法的返回值类型<br>
* 获取方法的GenericReturnType
@ -184,6 +197,7 @@ public class TypeUtil {
}
// ----------------------------------------------------------------------------------- Type Argument
/**
* 获得给定类的第一个泛型参数
*
@ -216,7 +230,7 @@ public class TypeUtil {
* class A&lt;T&gt;
* class B extends A&lt;String&gt;
* </pre>
*
* <p>
* 通过此方法传入B.class即可得到String
*
* @param type 指定类型
@ -240,7 +254,7 @@ public class TypeUtil {
* class A&lt;T&gt;
* class B extends A&lt;String&gt;
* </pre>
*
* <p>
* 通过此方法传入B.class即可得到B{@link ParameterizedType}从而获取到String
*
* @param type {@link Type}
@ -276,7 +290,6 @@ public class TypeUtil {
* 1. typeDefineClass必须是clazz的父类或者clazz实现的接口
* </pre>
*
*
* @param actualType 真实类型所在类此类中记录了泛型参数对应的实际类型
* @param typeDefineClass 泛型变量声明所在类或接口此类中定义了泛型类型
* @return 给定泛型参数对应的实际类型如果无对应类型返回null
@ -311,7 +324,6 @@ public class TypeUtil {
* 2. typeVariable必须在superClass中声明
* </pre>
*
*
* @param actualType 真实类型所在类此类中记录了泛型参数对应的实际类型
* @param typeDefineClass 泛型变量声明所在类或接口此类中定义了泛型类型
* @param typeVariables 泛型变量需要的实际类型对应的泛型参数
@ -340,7 +352,6 @@ public class TypeUtil {
* 2. typeVariable必须在superClass中声明
* </pre>
*
*
* @param actualType 真实类型所在类此类中记录了泛型参数对应的实际类型
* @param typeDefineClass 泛型变量声明所在类或接口此类中定义了泛型类型
* @param typeVariable 泛型变量需要的实际类型对应的泛型参数
@ -369,6 +380,7 @@ public class TypeUtil {
/**
* 指定泛型数组中是否含有泛型变量
*
* @param types 泛型数组
* @return 是否含有泛型变量
* @since 4.5.7

View File

@ -1,5 +1,6 @@
package cn.hutool.core.util;
import lombok.Data;
import org.junit.Assert;
import org.junit.Test;
@ -59,7 +60,23 @@ public class TypeUtilTest {
@Test
public void getActualTypesTest(){
final Type id = TypeUtil.getActualType(
Station.class,
Entity.class,
TypeUtil.getFieldType(Station.class, "id"));
}
public static class Station extends Tree<Station, Long>{
}
public static class Tree<E, T> extends Entity<T>{
}
@Data
public static class Entity<T>{
private T id;
}
}

View File

@ -134,7 +134,7 @@ public class CglibUtil {
public static <S, T> List<T> copyList(Collection<S> source, Supplier<T> target, Converter converter, BiConsumer<S, T> callback) {
return source.stream().map(s -> {
T t = target.get();
copy(source, t, converter);
copy(s, t, converter);
if (callback != null) {
callback.accept(s, t);
}