Browse Source

可选参数,方法重载优先级问题

JJZhang 5 years ago
parent
commit
b612eecb33

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

@@ -16,187 +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类
-	 * @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 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;
+
+    /**
+     * 创建一个{@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();
+    }
 }

+ 50 - 0
hutool-core/src/test/java/cn/hutool/core/bean/DynaBeanTest.java

@@ -33,6 +33,56 @@ public class DynaBeanTest {
 		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{
 		private String name;