fix incoke

This commit is contained in:
Looly 2020-03-23 10:38:37 +08:00
parent 122f5be484
commit 15b6bb7aef
6 changed files with 47 additions and 10 deletions

View File

@ -6,6 +6,8 @@
## 5.2.5
### 新特性
* 【core 】 增加逻辑对于原始类型注入issue#797@Github
### Bug修复
-------------------------------------------------------------------------------------------------------------

View File

@ -1,3 +1,3 @@
#!/bin/bash
exec mvn clean source:jar javadoc:javadoc install -Dmaven.test.skip=false -Dmaven.javadoc.skip=false
exec mvn -T 1C clean source:jar javadoc:javadoc install -Dmaven.test.skip=false -Dmaven.javadoc.skip=false

View File

@ -11,7 +11,6 @@ import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Method;
import java.util.HashMap;
@ -67,7 +66,7 @@ public class AnnotationUtil {
* 如果无指定的属性方法返回null
*
* @param <T> 注解值类型
* @param annotationEle {@link AccessibleObject}可以是ClassMethodFieldConstructorReflectPermission
* @param annotationEle {@link AnnotatedElement}可以是ClassMethodFieldConstructorReflectPermission
* @param annotationType 注解类型
* @return 注解对象
* @throws UtilException 调用注解中的方法时执行异常
@ -81,7 +80,7 @@ public class AnnotationUtil {
* 如果无指定的属性方法返回null
*
* @param <T> 注解值类型
* @param annotationEle {@link AccessibleObject}可以是ClassMethodFieldConstructorReflectPermission
* @param annotationEle {@link AnnotatedElement}可以是ClassMethodFieldConstructorReflectPermission
* @param annotationType 注解类型
* @param propertyName 属性名例如注解中定义了name()方法 此处传入name
* @return 注解对象

View File

@ -283,7 +283,7 @@ public class BeanCopier<T> implements Copier<T>, Serializable {
ReflectUtil.setFieldValue(bean, field, value);
} else{
// 执行set方法注入值
setterMethod.invoke(bean, value);
ReflectUtil.invoke(bean, setterMethod, value);
}
} catch (Exception e) {
if (false ==copyOptions.ignoreError) {

View File

@ -304,7 +304,7 @@ public class ReflectUtil {
Assert.notNull(obj);
Assert.notBlank(fieldName);
final Field field = getField((obj instanceof Class) ? (Class<?>)obj : obj.getClass(), fieldName);
final Field field = getField((obj instanceof Class) ? (Class<?>) obj : obj.getClass(), fieldName);
Assert.notNull(field, "Field [{}] is not exist in [{}]", fieldName, obj.getClass().getName());
setFieldValue(obj, field, value);
}
@ -320,8 +320,8 @@ public class ReflectUtil {
public static void setFieldValue(Object obj, Field field, Object value) throws UtilException {
Assert.notNull(field, "Field in [{}] not exist !", obj);
final Class<?> fieldType = field.getType();
if (null != value) {
Class<?> fieldType = field.getType();
if (false == fieldType.isAssignableFrom(value.getClass())) {
//对于类型不同的字段尝试转换转换失败则使用原对象类型
final Object targetValue = Convert.convert(fieldType, value);
@ -329,6 +329,9 @@ public class ReflectUtil {
value = targetValue;
}
}
} else {
// 获取null对应默认值防止原始类型造成空指针问题
value = ClassUtil.getDefaultValue(fieldType);
}
setAccessible(field);
@ -848,6 +851,15 @@ public class ReflectUtil {
/**
* 执行方法
*
* <p>
* 对于用户传入参数会做必要检查包括
*
* <pre>
* 1忽略多余的参数
* 2参数不够补齐默认值
* 3传入参数为null但是目标参数类型为原始类型做转换
* </pre>
*
* @param <T> 返回对象类型
* @param obj 对象如果执行静态方法此值为<code>null</code>
* @param method 方法对象方法或static方法都可
@ -859,8 +871,32 @@ public class ReflectUtil {
public static <T> T invoke(Object obj, Method method, Object... args) throws UtilException {
setAccessible(method);
// 检查用户传入参数
// 1忽略多余的参数
// 2参数不够补齐默认值
// 3传入参数为null但是目标参数类型为原始类型做转换
// 4传入参数类型不对应尝试转换类型
final Class<?>[] parameterTypes = method.getParameterTypes();
final Object[] actualArgs = new Object[parameterTypes.length];
if (null != args) {
for (int i = 0; i < actualArgs.length; i++) {
if (i >= args.length || null == args[i]) {
// 越界或者空值
actualArgs[i] = ClassUtil.getDefaultValue(parameterTypes[i]);
} else if (false == parameterTypes[i].isAssignableFrom(args[i].getClass())) {
//对于类型不同的字段尝试转换转换失败则使用原对象类型
final Object targetValue = Convert.convert(parameterTypes[i], args[i]);
if (null != targetValue) {
actualArgs[i] = targetValue;
}
} else {
actualArgs[i] = args[i];
}
}
}
try {
return (T) method.invoke(ClassUtil.isStatic(method) ? null : obj, args);
return (T) method.invoke(ClassUtil.isStatic(method) ? null : obj, actualArgs);
} catch (Exception e) {
throw new UtilException(e);
}

View File

@ -321,9 +321,9 @@ public class BeanUtilTest {
@Test
public void beanToBeanTest(){
// 对象无getter方法导致报错的问题
// 复对象无getter方法导致报错的问题
Page page1=new Page();
BeanUtil.toBean(page1, Page.class, CopyOptions.create().setIgnoreNullValue(true));
BeanUtil.toBean(page1, Page.class);
}
public static class Page {