Looly 5 年之前
父节点
当前提交
387845b869

+ 3 - 1
CHANGELOG.md

@@ -3,9 +3,11 @@
 
 -------------------------------------------------------------------------------------------------------------
 
-# 5.5.7 (2020-12-29)
+# 5.5.7 (2021-01-02)
 
 ### 新特性
+* 【core   】     DynaBean.create增加重载方法(pr#245@Gitee)
+
 ### Bug修复
 
 -------------------------------------------------------------------------------------------------------------

+ 203 - 203
hutool-core/src/main/java/cn/hutool/core/bean/DynaBean.java

@@ -16,207 +16,207 @@ import java.util.Map;
  * @since 3.0.7
  */
 public class DynaBean extends CloneSupport<DynaBean> implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    private final Class<?> beanClass;
-    private final Object bean;
-
-    /**
-     * 创建一个{@link DynaBean}
-     *
-     * @param bean 普通Bean
-     * @return {@link DynaBean}
-     */
-    public static DynaBean create(Object bean) {
-        return new DynaBean(bean);
-    }
-
-    /**
-     * 创建一个{@link DynaBean}
-     *
-     * @param beanClass Bean类
-     * @return {@link DynaBean}
-     */
-    public static DynaBean create(Class<?> beanClass) {
-        return new DynaBean(beanClass);
-    }
-
-
-    /**
-     * 创建一个{@link DynaBean}
-     *
-     * @param beanClass Bean类
-     * @param params    构造Bean所需要的参数
-     * @return {@link DynaBean}
-     */
-    public static DynaBean create(Class<?> beanClass, Object... params) {
-        return new DynaBean(beanClass, params);
-    }
-
-    //------------------------------------------------------------------------ Constructor start
-
-    /**
-     * 构造
-     *
-     * @param beanClass Bean类
-     * @param params    构造Bean所需要的参数
-     */
-    public DynaBean(Class<?> beanClass, Object... params) {
-        this(ReflectUtil.newInstance(beanClass, params));
-    }
-
-    /**
-     * 构造
-     *
-     * @param beanClass Bean类
-     */
-    public DynaBean(Class<?> beanClass) {
-        this(ReflectUtil.newInstance(beanClass));
-    }
-
-    /**
-     * 构造
-     *
-     * @param bean 原始Bean
-     */
-    public DynaBean(Object bean) {
-        Assert.notNull(bean);
-        if (bean instanceof DynaBean) {
-            bean = ((DynaBean) bean).getBean();
-        }
-        this.bean = bean;
-        this.beanClass = ClassUtil.getClass(bean);
-    }
-    //------------------------------------------------------------------------ Constructor end
-
-    /**
-     * 获得字段对应值
-     *
-     * @param <T>       属性值类型
-     * @param fieldName 字段名
-     * @return 字段值
-     * @throws BeanException 反射获取属性值或字段值导致的异常
-     */
-    @SuppressWarnings("unchecked")
-    public <T> T get(String fieldName) throws BeanException {
-        if (Map.class.isAssignableFrom(beanClass)) {
-            return (T) ((Map<?, ?>) bean).get(fieldName);
-        } else {
-            final PropDesc prop = BeanUtil.getBeanDesc(beanClass).getProp(fieldName);
-            if (null == prop) {
-                throw new BeanException("No public field or get method for {}", fieldName);
-            }
-            return (T) prop.getValue(bean);
-        }
-    }
-
-    /**
-     * 检查是否有指定名称的bean属性
-     *
-     * @param fieldName 字段名
-     * @return 是否有bean属性
-     * @since 5.4.2
-     */
-    public boolean containsProp(String fieldName) {
-        return null != BeanUtil.getBeanDesc(beanClass).getProp(fieldName);
-    }
-
-    /**
-     * 获得字段对应值,获取异常返回{@code null}
-     *
-     * @param <T>       属性值类型
-     * @param fieldName 字段名
-     * @return 字段值
-     * @since 3.1.1
-     */
-    public <T> T safeGet(String fieldName) {
-        try {
-            return get(fieldName);
-        } catch (Exception e) {
-            return null;
-        }
-    }
-
-    /**
-     * 设置字段值
-     *
-     * @param fieldName 字段名
-     * @param value     字段值
-     * @throws BeanException 反射获取属性值或字段值导致的异常
-     */
-    @SuppressWarnings({"unchecked", "rawtypes"})
-    public void set(String fieldName, Object value) throws BeanException {
-        if (Map.class.isAssignableFrom(beanClass)) {
-            ((Map) bean).put(fieldName, value);
-        } else {
-            final PropDesc prop = BeanUtil.getBeanDesc(beanClass).getProp(fieldName);
-            if (null == prop) {
-                throw new BeanException("No public field or set method for {}", fieldName);
-            }
-            prop.setValue(bean, value);
-        }
-    }
-
-    /**
-     * 执行原始Bean中的方法
-     *
-     * @param methodName 方法名
-     * @param params     参数
-     * @return 执行结果,可能为null
-     */
-    public Object invoke(String methodName, Object... params) {
-        return ReflectUtil.invoke(this.bean, methodName, params);
-    }
-
-    /**
-     * 获得原始Bean
-     *
-     * @param <T> Bean类型
-     * @return bean
-     */
-    @SuppressWarnings("unchecked")
-    public <T> T getBean() {
-        return (T) this.bean;
-    }
-
-    /**
-     * 获得Bean的类型
-     *
-     * @param <T> Bean类型
-     * @return Bean类型
-     */
-    @SuppressWarnings("unchecked")
-    public <T> Class<T> getBeanClass() {
-        return (Class<T>) this.beanClass;
-    }
-
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((bean == null) ? 0 : bean.hashCode());
-        return result;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null) {
-            return false;
-        }
-        if (getClass() != obj.getClass()) {
-            return false;
-        }
-        final DynaBean other = (DynaBean) obj;
-        if (bean == null) {
-            return other.bean == null;
-        } else return bean.equals(other.bean);
-    }
-
-    @Override
-    public String toString() {
-        return this.bean.toString();
-    }
+	private static final long serialVersionUID = 1L;
+
+	private final Class<?> beanClass;
+	private final Object bean;
+
+	/**
+	 * 创建一个DynaBean
+	 *
+	 * @param bean 普通Bean
+	 * @return DynaBean
+	 */
+	public static DynaBean create(Object bean) {
+		return new DynaBean(bean);
+	}
+
+	/**
+	 * 创建一个DynaBean
+	 *
+	 * @param beanClass Bean类
+	 * @return DynaBean
+	 */
+	public static DynaBean create(Class<?> beanClass) {
+		return new DynaBean(beanClass);
+	}
+
+
+	/**
+	 * 创建一个DynaBean
+	 *
+	 * @param beanClass Bean类
+	 * @param params    构造Bean所需要的参数
+	 * @return DynaBean
+	 */
+	public static DynaBean create(Class<?> beanClass, Object... params) {
+		return new DynaBean(beanClass, params);
+	}
+
+	//------------------------------------------------------------------------ Constructor start
+
+	/**
+	 * 构造
+	 *
+	 * @param beanClass Bean类
+	 * @param params    构造Bean所需要的参数
+	 */
+	public DynaBean(Class<?> beanClass, Object... params) {
+		this(ReflectUtil.newInstance(beanClass, params));
+	}
+
+	/**
+	 * 构造
+	 *
+	 * @param beanClass Bean类
+	 */
+	public DynaBean(Class<?> beanClass) {
+		this(ReflectUtil.newInstance(beanClass));
+	}
+
+	/**
+	 * 构造
+	 *
+	 * @param bean 原始Bean
+	 */
+	public DynaBean(Object bean) {
+		Assert.notNull(bean);
+		if (bean instanceof DynaBean) {
+			bean = ((DynaBean) bean).getBean();
+		}
+		this.bean = bean;
+		this.beanClass = ClassUtil.getClass(bean);
+	}
+	//------------------------------------------------------------------------ Constructor end
+
+	/**
+	 * 获得字段对应值
+	 *
+	 * @param <T>       属性值类型
+	 * @param fieldName 字段名
+	 * @return 字段值
+	 * @throws BeanException 反射获取属性值或字段值导致的异常
+	 */
+	@SuppressWarnings("unchecked")
+	public <T> T get(String fieldName) throws BeanException {
+		if (Map.class.isAssignableFrom(beanClass)) {
+			return (T) ((Map<?, ?>) bean).get(fieldName);
+		} else {
+			final PropDesc prop = BeanUtil.getBeanDesc(beanClass).getProp(fieldName);
+			if (null == prop) {
+				throw new BeanException("No public field or get method for {}", fieldName);
+			}
+			return (T) prop.getValue(bean);
+		}
+	}
+
+	/**
+	 * 检查是否有指定名称的bean属性
+	 *
+	 * @param fieldName 字段名
+	 * @return 是否有bean属性
+	 * @since 5.4.2
+	 */
+	public boolean containsProp(String fieldName) {
+		return null != BeanUtil.getBeanDesc(beanClass).getProp(fieldName);
+	}
+
+	/**
+	 * 获得字段对应值,获取异常返回{@code null}
+	 *
+	 * @param <T>       属性值类型
+	 * @param fieldName 字段名
+	 * @return 字段值
+	 * @since 3.1.1
+	 */
+	public <T> T safeGet(String fieldName) {
+		try {
+			return get(fieldName);
+		} catch (Exception e) {
+			return null;
+		}
+	}
+
+	/**
+	 * 设置字段值
+	 *
+	 * @param fieldName 字段名
+	 * @param value     字段值
+	 * @throws BeanException 反射获取属性值或字段值导致的异常
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public void set(String fieldName, Object value) throws BeanException {
+		if (Map.class.isAssignableFrom(beanClass)) {
+			((Map) bean).put(fieldName, value);
+		} else {
+			final PropDesc prop = BeanUtil.getBeanDesc(beanClass).getProp(fieldName);
+			if (null == prop) {
+				throw new BeanException("No public field or set method for {}", fieldName);
+			}
+			prop.setValue(bean, value);
+		}
+	}
+
+	/**
+	 * 执行原始Bean中的方法
+	 *
+	 * @param methodName 方法名
+	 * @param params     参数
+	 * @return 执行结果,可能为null
+	 */
+	public Object invoke(String methodName, Object... params) {
+		return ReflectUtil.invoke(this.bean, methodName, params);
+	}
+
+	/**
+	 * 获得原始Bean
+	 *
+	 * @param <T> Bean类型
+	 * @return bean
+	 */
+	@SuppressWarnings("unchecked")
+	public <T> T getBean() {
+		return (T) this.bean;
+	}
+
+	/**
+	 * 获得Bean的类型
+	 *
+	 * @param <T> Bean类型
+	 * @return Bean类型
+	 */
+	@SuppressWarnings("unchecked")
+	public <T> Class<T> getBeanClass() {
+		return (Class<T>) this.beanClass;
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + ((bean == null) ? 0 : bean.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj) {
+			return true;
+		}
+		if (obj == null) {
+			return false;
+		}
+		if (getClass() != obj.getClass()) {
+			return false;
+		}
+		final DynaBean other = (DynaBean) obj;
+		if (bean == null) {
+			return other.bean == null;
+		} else return bean.equals(other.bean);
+	}
+
+	@Override
+	public String toString() {
+		return this.bean.toString();
+	}
 }

+ 60 - 77
hutool-core/src/test/java/cn/hutool/core/bean/DynaBeanTest.java

@@ -1,112 +1,95 @@
 package cn.hutool.core.bean;
 
+import lombok.Data;
 import org.junit.Assert;
 import org.junit.Test;
 
-import cn.hutool.core.bean.DynaBean;
-
 /**
  * {@link DynaBean}单元测试
- * @author Looly
  *
+ * @author Looly
  */
 public class DynaBeanTest {
-	
+
 	@Test
-	public void beanTest(){
+	public void beanTest() {
 		User user = new User();
 		DynaBean bean = DynaBean.create(user);
 		bean.set("name", "李华");
 		bean.set("age", 12);
-		
+
 		String name = bean.get("name");
 		Assert.assertEquals(user.getName(), name);
 		int age = bean.get("age");
 		Assert.assertEquals(user.getAge(), age);
-		
+
 		//重复包装测试
 		DynaBean bean2 = new DynaBean(bean);
 		User user2 = bean2.getBean();
 		Assert.assertEquals(user, user2);
-		
+
+		//执行指定方法
+		Object invoke = bean2.invoke("testMethod");
+		Assert.assertEquals("test for 李华", invoke);
+	}
+
+
+	@Test
+	public void beanByStaticClazzConstructorTest() {
+		String name_before = "李华";
+		int age_before = 12;
+		DynaBean bean = DynaBean.create(User.class);
+		bean.set("name", name_before);
+		bean.set("age", age_before);
+
+		String name_after = bean.get("name");
+		Assert.assertEquals(name_before, name_after);
+		int age_after = bean.get("age");
+		Assert.assertEquals(age_before, age_after);
+
+		//重复包装测试
+		DynaBean bean2 = new DynaBean(bean);
+		User user2 = bean2.getBean();
+		User user1 = bean.getBean();
+		Assert.assertEquals(user1, user2);
+
 		//执行指定方法
 		Object invoke = bean2.invoke("testMethod");
 		Assert.assertEquals("test for 李华", invoke);
 	}
 
 
-    @Test
-    public void bean_by_static_clazz_constructor_Test() {
-        String name_before = "李华";
-        int age_before = 12;
-        DynaBean bean = DynaBean.create(User.class);
-        bean.set("name", name_before);
-        bean.set("age", age_before);
-
-        String name_after = bean.get("name");
-        Assert.assertEquals(name_before, name_after);
-        int age_after = bean.get("age");
-        Assert.assertEquals(age_before, age_after);
-
-        //重复包装测试
-        DynaBean bean2 = new DynaBean(bean);
-        User user2 = bean2.getBean();
-        User user1 = bean.getBean();
-        Assert.assertEquals(user1, user2);
-
-        //执行指定方法
-        Object invoke = bean2.invoke("testMethod");
-        Assert.assertEquals("test for 李华", invoke);
-    }
-
-
-    @Test
-    public void bean_by_instance_clazz_constructor_Test() {
-        String name_before = "李华";
-        int age_before = 12;
-        DynaBean bean = new DynaBean(User.class);
-        bean.set("name", name_before);
-        bean.set("age", age_before);
-
-        String name_after = bean.get("name");
-        Assert.assertEquals(name_before, name_after);
-        int age_after = bean.get("age");
-        Assert.assertEquals(age_before, age_after);
-
-        //重复包装测试
-        DynaBean bean2 = new DynaBean(bean);
-        User user2 = bean2.getBean();
-        User user1 = bean.getBean();
-        Assert.assertEquals(user1, user2);
-
-        //执行指定方法
-        Object invoke = bean2.invoke("testMethod");
-        Assert.assertEquals("test for 李华", invoke);
-    }
-	
-	public static class User{
+	@Test
+	public void beanByInstanceClazzConstructorTest() {
+		String name_before = "李华";
+		int age_before = 12;
+		DynaBean bean = new DynaBean(User.class);
+		bean.set("name", name_before);
+		bean.set("age", age_before);
+
+		String name_after = bean.get("name");
+		Assert.assertEquals(name_before, name_after);
+		int age_after = bean.get("age");
+		Assert.assertEquals(age_before, age_after);
+
+		//重复包装测试
+		DynaBean bean2 = new DynaBean(bean);
+		User user2 = bean2.getBean();
+		User user1 = bean.getBean();
+		Assert.assertEquals(user1, user2);
+
+		//执行指定方法
+		Object invoke = bean2.invoke("testMethod");
+		Assert.assertEquals("test for 李华", invoke);
+	}
+
+	@Data
+	public static class User {
 		private String name;
 		private int age;
-		public String getName() {
-			return name;
-		}
-		public void setName(String name) {
-			this.name = name;
-		}
-		public int getAge() {
-			return age;
-		}
-		public void setAge(int age) {
-			this.age = age;
-		}
-		
-		public String testMethod(){
+
+		public String testMethod() {
 			return "test for " + this.name;
 		}
-		
-		@Override
-		public String toString() {
-			return "User [name=" + name + ", age=" + age + "]";
-		}
 	}
 }