This commit is contained in:
Looly 2022-05-05 00:55:02 +08:00
parent 29255272b5
commit 663be40590
17 changed files with 130 additions and 118 deletions

View File

@ -1,8 +1,8 @@
package cn.hutool.core.compiler;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.reflect.ReflectUtil;
import cn.hutool.core.compress.ZipUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.reflect.ConstructorUtil;
import org.junit.Assert;
import org.junit.Test;
@ -36,7 +36,7 @@ public class JavaSourceCompilerTest {
// .addLibrary(FileUtil.file("D:\\m2_repo\\cn\\hutool\\hutool-all\\5.5.7\\hutool-all-5.5.7.jar"))
.compile();
final Class<?> clazz = classLoader.loadClass("c.C");
final Object obj = ReflectUtil.newInstance(clazz);
final Object obj = ConstructorUtil.newInstance(clazz);
Assert.assertTrue(String.valueOf(obj).startsWith("c.C@"));
}

View File

@ -0,0 +1,39 @@
package cn.hutool.core.reflect;
import cn.hutool.core.date.Week;
import org.junit.Assert;
import org.junit.Test;
import java.util.Collection;
import java.util.Map;
public class ConstructorUtilTest {
@Test
public void noneStaticInnerClassTest() {
final ReflectUtilTest.NoneStaticClass testAClass = ConstructorUtil.newInstanceIfPossible(ReflectUtilTest.NoneStaticClass.class);
Assert.assertNotNull(testAClass);
Assert.assertEquals(2, testAClass.getA());
}
@Test
public void newInstanceIfPossibleTest(){
//noinspection ConstantConditions
final int intValue = ConstructorUtil.newInstanceIfPossible(int.class);
Assert.assertEquals(0, intValue);
final Integer integer = ConstructorUtil.newInstanceIfPossible(Integer.class);
Assert.assertEquals(new Integer(0), integer);
final Map<?, ?> map = ConstructorUtil.newInstanceIfPossible(Map.class);
Assert.assertNotNull(map);
final Collection<?> collection = ConstructorUtil.newInstanceIfPossible(Collection.class);
Assert.assertNotNull(collection);
final Week week = ConstructorUtil.newInstanceIfPossible(Week.class);
Assert.assertEquals(Week.SUNDAY, week);
final int[] intArray = ConstructorUtil.newInstanceIfPossible(int[].class);
Assert.assertArrayEquals(new int[0], intArray);
}
}

View File

@ -0,0 +1,42 @@
package cn.hutool.core.reflect;
import org.junit.Assert;
import org.junit.Test;
import java.lang.reflect.Field;
public class FieldUtilTest {
@Test
public void getFieldTest() {
// 能够获取到父类字段
final Field privateField = FieldUtil.getField(ReflectUtilTest.TestSubClass.class, "privateField");
Assert.assertNotNull(privateField);
}
@Test
public void getFieldsTest() {
// 能够获取到父类字段
final Field[] fields = FieldUtil.getFields(ReflectUtilTest.TestSubClass.class);
Assert.assertEquals(4, fields.length);
}
@Test
public void setFieldTest() {
final ReflectUtilTest.AClass testClass = new ReflectUtilTest.AClass();
FieldUtil.setFieldValue(testClass, "a", "111");
Assert.assertEquals(111, testClass.getA());
}
@Test
public void getDeclaredField() {
final Field noField = FieldUtil.getField(ReflectUtilTest.TestSubClass.class, "noField");
Assert.assertNull(noField);
// 获取不到父类字段
final Field field = FieldUtil.getDeClearField(ReflectUtilTest.TestSubClass.class, "field");
Assert.assertNull(field);
final Field subField = FieldUtil.getField(ReflectUtilTest.TestSubClass.class, "subField");
Assert.assertNotNull(subField);
}
}

View File

@ -1,13 +1,6 @@
package cn.hutool.core.reflect;
import cn.hutool.core.date.Week;
import lombok.Data;
import org.junit.Assert;
import org.junit.Test;
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.Map;
/**
* 反射工具类单元测试
@ -16,34 +9,6 @@ import java.util.Map;
*/
public class ReflectUtilTest {
@Test
public void getFieldTest() {
// 能够获取到父类字段
final Field privateField = ReflectUtil.getField(TestSubClass.class, "privateField");
Assert.assertNotNull(privateField);
}
@Test
public void getFieldsTest() {
// 能够获取到父类字段
final Field[] fields = ReflectUtil.getFields(TestSubClass.class);
Assert.assertEquals(4, fields.length);
}
@Test
public void setFieldTest() {
final AClass testClass = new AClass();
ReflectUtil.setFieldValue(testClass, "a", "111");
Assert.assertEquals(111, testClass.getA());
}
@Test
public void noneStaticInnerClassTest() {
final NoneStaticClass testAClass = ReflectUtil.newInstanceIfPossible(NoneStaticClass.class);
Assert.assertNotNull(testAClass);
Assert.assertEquals(2, testAClass.getA());
}
@Data
static class AClass {
private int a;
@ -117,41 +82,6 @@ public class ReflectUtilTest {
}
}
@Test
public void newInstanceIfPossibleTest(){
//noinspection ConstantConditions
final int intValue = ReflectUtil.newInstanceIfPossible(int.class);
Assert.assertEquals(0, intValue);
final Integer integer = ReflectUtil.newInstanceIfPossible(Integer.class);
Assert.assertEquals(new Integer(0), integer);
final Map<?, ?> map = ReflectUtil.newInstanceIfPossible(Map.class);
Assert.assertNotNull(map);
final Collection<?> collection = ReflectUtil.newInstanceIfPossible(Collection.class);
Assert.assertNotNull(collection);
final Week week = ReflectUtil.newInstanceIfPossible(Week.class);
Assert.assertEquals(Week.SUNDAY, week);
final int[] intArray = ReflectUtil.newInstanceIfPossible(int[].class);
Assert.assertArrayEquals(new int[0], intArray);
}
@Test
public void getDeclaredField() {
final Field noField = ReflectUtil.getField(TestSubClass.class, "noField");
Assert.assertNull(noField);
// 获取不到父类字段
final Field field = ReflectUtil.getDeClearField(TestSubClass.class, "field");
Assert.assertNull(field);
final Field subField = ReflectUtil.getField(TestSubClass.class, "subField");
Assert.assertNotNull(subField);
}
@SuppressWarnings("unused")
static class TestClass {
private String privateField;

View File

@ -1,7 +1,7 @@
package cn.hutool.core.util;
import cn.hutool.core.reflect.FieldUtil;
import cn.hutool.core.reflect.MethodUtil;
import cn.hutool.core.reflect.ReflectUtil;
import cn.hutool.core.reflect.TypeUtil;
import lombok.Data;
import org.junit.Assert;
@ -65,7 +65,7 @@ public class TypeUtilTest {
public void getActualTypesTest(){
// 测试多层级泛型参数是否能获取成功
final Type idType = TypeUtil.getActualType(Level3.class,
ReflectUtil.getField(Level3.class, "id"));
FieldUtil.getField(Level3.class, "id"));
Assert.assertEquals(Long.class, idType);
}

View File

@ -2,8 +2,8 @@ package cn.hutool.cron.task;
import cn.hutool.core.classloader.ClassLoaderUtil;
import cn.hutool.core.exceptions.UtilException;
import cn.hutool.core.reflect.ConstructorUtil;
import cn.hutool.core.reflect.MethodUtil;
import cn.hutool.core.reflect.ReflectUtil;
import cn.hutool.core.text.StrUtil;
import cn.hutool.cron.CronException;
@ -44,7 +44,7 @@ public class InvokeTask implements Task{
if(null == clazz) {
throw new IllegalArgumentException("Load class with name of [" + className + "] fail !");
}
this.obj = ReflectUtil.newInstanceIfPossible(clazz);
this.obj = ConstructorUtil.newInstanceIfPossible(clazz);
//方法
final String methodName = classNameWithMethodName.substring(splitIndex + 1);

View File

@ -4,11 +4,11 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.PropDesc;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.reflect.ConstructorUtil;
import cn.hutool.core.reflect.MethodUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.reflect.ReflectUtil;
import cn.hutool.core.text.StrUtil;
import cn.hutool.core.reflect.TypeUtil;
import cn.hutool.core.text.StrUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.db.DbRuntimeException;
import cn.hutool.db.Entity;
@ -84,7 +84,7 @@ public class ResultSetUtil {
}
//普通bean
final T bean = ReflectUtil.newInstanceIfPossible(beanClass);
final T bean = ConstructorUtil.newInstanceIfPossible(beanClass);
//忽略字段大小写
final Map<String, PropDesc> propMap = BeanUtil.getBeanDesc(beanClass).getPropMap(true);
String columnLabel;

View File

@ -1,8 +1,8 @@
package cn.hutool.extra.aop.proxy;
import cn.hutool.extra.aop.aspects.Aspect;
import cn.hutool.core.reflect.ReflectUtil;
import cn.hutool.core.reflect.ConstructorUtil;
import cn.hutool.core.util.ServiceLoaderUtil;
import cn.hutool.extra.aop.aspects.Aspect;
import java.io.Serializable;
@ -25,7 +25,7 @@ public abstract class ProxyFactory implements Serializable {
* @since 5.3.1
*/
public <T> T proxy(final T target, final Class<? extends Aspect> aspectClass) {
return proxy(target, ReflectUtil.newInstanceIfPossible(aspectClass));
return proxy(target, ConstructorUtil.newInstanceIfPossible(aspectClass));
}
/**
@ -47,7 +47,7 @@ public abstract class ProxyFactory implements Serializable {
* @return 代理对象
*/
public static <T> T createProxy(final T target, final Class<? extends Aspect> aspectClass) {
return createProxy(target, ReflectUtil.newInstance(aspectClass));
return createProxy(target, ConstructorUtil.newInstance(aspectClass));
}
/**

View File

@ -1,7 +1,7 @@
package cn.hutool.extra.cglib;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.reflect.ReflectUtil;
import cn.hutool.core.reflect.ConstructorUtil;
import net.sf.cglib.beans.BeanCopier;
import net.sf.cglib.beans.BeanMap;
import net.sf.cglib.core.Converter;
@ -45,7 +45,7 @@ public class CglibUtil {
* @return 目标对象
*/
public static <T> T copy(final Object source, final Class<T> targetClass, final Converter converter) {
final T target = ReflectUtil.newInstanceIfPossible(targetClass);
final T target = ConstructorUtil.newInstanceIfPossible(targetClass);
copy(source, target, converter);
return target;
}
@ -178,6 +178,6 @@ public class CglibUtil {
*/
@SuppressWarnings("rawtypes")
public static <T> T toBean(final Map map, final Class<T> beanClass){
return fillBean(map, ReflectUtil.newInstanceIfPossible(beanClass));
return fillBean(map, ConstructorUtil.newInstanceIfPossible(beanClass));
}
}

View File

@ -15,11 +15,11 @@ import cn.hutool.core.net.NetUtil;
import cn.hutool.core.net.URLEncoder;
import cn.hutool.core.net.multipart.MultipartFormData;
import cn.hutool.core.net.multipart.UploadSetting;
import cn.hutool.core.reflect.ConstructorUtil;
import cn.hutool.core.text.StrUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.reflect.ReflectUtil;
import cn.hutool.core.text.StrUtil;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.http.Cookie;
@ -182,7 +182,7 @@ public class JakartaServletUtil {
* @return Bean
*/
public static <T> T toBean(final ServletRequest request, final Class<T> beanClass, final boolean isIgnoreError) {
return fillBean(request, ReflectUtil.newInstanceIfPossible(beanClass), isIgnoreError);
return fillBean(request, ConstructorUtil.newInstanceIfPossible(beanClass), isIgnoreError);
}
// --------------------------------------------------------- fillBean end

View File

@ -15,11 +15,11 @@ import cn.hutool.core.net.NetUtil;
import cn.hutool.core.net.URLEncoder;
import cn.hutool.core.net.multipart.MultipartFormData;
import cn.hutool.core.net.multipart.UploadSetting;
import cn.hutool.core.reflect.ConstructorUtil;
import cn.hutool.core.text.StrUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.reflect.ReflectUtil;
import cn.hutool.core.text.StrUtil;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
@ -182,7 +182,7 @@ public class ServletUtil {
* @return Bean
*/
public static <T> T toBean(final ServletRequest request, final Class<T> beanClass, final boolean isIgnoreError) {
return fillBean(request, ReflectUtil.newInstanceIfPossible(beanClass), isIgnoreError);
return fillBean(request, ConstructorUtil.newInstanceIfPossible(beanClass), isIgnoreError);
}
// --------------------------------------------------------- fillBean end

View File

@ -1,9 +1,9 @@
package cn.hutool.extra.template.engine;
import cn.hutool.core.lang.Singleton;
import cn.hutool.core.reflect.ReflectUtil;
import cn.hutool.core.util.ServiceLoaderUtil;
import cn.hutool.core.reflect.ConstructorUtil;
import cn.hutool.core.text.StrUtil;
import cn.hutool.core.util.ServiceLoaderUtil;
import cn.hutool.extra.template.TemplateConfig;
import cn.hutool.extra.template.TemplateEngine;
import cn.hutool.extra.template.TemplateException;
@ -61,7 +61,7 @@ public class TemplateFactory {
final Class<? extends TemplateEngine> customEngineClass = config.getCustomEngine();
final TemplateEngine engine;
if(null != customEngineClass){
engine = ReflectUtil.newInstance(customEngineClass);
engine = ConstructorUtil.newInstance(customEngineClass);
}else{
engine = ServiceLoaderUtil.loadFirstAvailable(TemplateEngine.class);
}

View File

@ -1,10 +1,10 @@
package cn.hutool.http;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.reflect.ReflectUtil;
import cn.hutool.core.text.StrUtil;
import cn.hutool.core.net.URLUtil;
import cn.hutool.core.reflect.FieldUtil;
import cn.hutool.core.text.StrUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.http.ssl.DefaultSSLInfo;
import javax.net.ssl.HostnameVerifier;
@ -453,7 +453,7 @@ public class HttpConnection {
// 修改为POST而且无法调用setRequestMethod方法修改因此此处使用反射强制修改字段属性值
// https://stackoverflow.com/questions/978061/http-get-with-request-body/983458
if(method == Method.GET && method != getMethod()){
ReflectUtil.setFieldValue(this.conn, "method", Method.GET.name());
FieldUtil.setFieldValue(this.conn, "method", Method.GET.name());
}
return out;

View File

@ -1,8 +1,8 @@
package cn.hutool.http;
import cn.hutool.core.reflect.FieldUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.reflect.ReflectUtil;
import cn.hutool.http.cookie.GlobalCookieManager;
import java.io.Serializable;
@ -192,20 +192,20 @@ public class HttpGlobalConfig implements Serializable {
if (isAllowPatch) {
return;
}
final Field methodsField = ReflectUtil.getField(HttpURLConnection.class, "methods");
final Field methodsField = FieldUtil.getField(HttpURLConnection.class, "methods");
if (null == methodsField) {
throw new HttpException("None static field [methods] with Java version: [{}]", System.getProperty("java.version"));
}
// 去除final修饰
ReflectUtil.setFieldValue(methodsField, "modifiers", methodsField.getModifiers() & ~Modifier.FINAL);
FieldUtil.setFieldValue(methodsField, "modifiers", methodsField.getModifiers() & ~Modifier.FINAL);
final String[] methods = {
"GET", "POST", "HEAD", "OPTIONS", "PUT", "DELETE", "TRACE", "PATCH"
};
ReflectUtil.setFieldValue(null, methodsField, methods);
FieldUtil.setFieldValue(null, methodsField, methods);
// 检查注入是否成功
final Object staticFieldValue = ReflectUtil.getStaticFieldValue(methodsField);
final Object staticFieldValue = FieldUtil.getStaticFieldValue(methodsField);
if (false == ArrayUtil.equals(methods, staticFieldValue)) {
throw new HttpException("Inject value to field [methods] failed!");
}

View File

@ -7,10 +7,10 @@ import cn.hutool.core.convert.Converter;
import cn.hutool.core.convert.ConverterRegistry;
import cn.hutool.core.convert.impl.ArrayConverter;
import cn.hutool.core.convert.impl.BeanConverter;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.reflect.ReflectUtil;
import cn.hutool.core.text.StrUtil;
import cn.hutool.core.reflect.ConstructorUtil;
import cn.hutool.core.reflect.TypeUtil;
import cn.hutool.core.text.StrUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.json.serialize.GlobalSerializeMapping;
import cn.hutool.json.serialize.JSONDeserializer;
@ -78,7 +78,8 @@ public class JSONConverter implements Converter<JSON> {
if(targetType instanceof Class){
final Class<?> clazz = (Class<?>) targetType;
if (JSONBeanParser.class.isAssignableFrom(clazz)){
@SuppressWarnings("rawtypes") final JSONBeanParser target = (JSONBeanParser) ReflectUtil.newInstanceIfPossible(clazz);
@SuppressWarnings("rawtypes")
final JSONBeanParser target = (JSONBeanParser) ConstructorUtil.newInstanceIfPossible(clazz);
if(null == target){
throw new ConvertException("Can not instance [{}]", targetType);
}

View File

@ -5,9 +5,9 @@ import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.bean.copier.ValueProvider;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.getter.OptNullBasicTypeFromStringGetter;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.reflect.ReflectUtil;
import cn.hutool.core.reflect.ConstructorUtil;
import cn.hutool.core.text.StrUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.log.Log;
import cn.hutool.log.LogFactory;
@ -311,7 +311,7 @@ public abstract class AbsSetting implements OptNullBasicTypeFromStringGetter<Str
* @since 5.0.6
*/
public <T> T toBean(final String group, final Class<T> beanClass) {
return toBean(group, ReflectUtil.newInstanceIfPossible(beanClass));
return toBean(group, ConstructorUtil.newInstanceIfPossible(beanClass));
}
/**

View File

@ -2,8 +2,6 @@ package cn.hutool.setting.dialect;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.getter.BasicTypeGetter;
import cn.hutool.core.lang.getter.OptBasicTypeGetter;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
@ -16,10 +14,12 @@ import cn.hutool.core.io.watch.SimpleWatcher;
import cn.hutool.core.io.watch.WatchMonitor;
import cn.hutool.core.io.watch.WatchUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.lang.getter.BasicTypeGetter;
import cn.hutool.core.lang.getter.OptBasicTypeGetter;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.reflect.ReflectUtil;
import cn.hutool.core.reflect.ConstructorUtil;
import cn.hutool.core.text.StrUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.log.StaticLog;
import java.io.BufferedReader;
@ -549,7 +549,7 @@ public final class Props extends Properties implements BasicTypeGetter<String>,
* @since 4.6.3
*/
public <T> T toBean(final Class<T> beanClass, final String prefix) {
final T bean = ReflectUtil.newInstanceIfPossible(beanClass);
final T bean = ConstructorUtil.newInstanceIfPossible(beanClass);
return fillBean(bean, prefix);
}