From 387845b869399df83bdd8da741cfd3cbfcb256ce Mon Sep 17 00:00:00 2001 From: Looly Date: Sat, 2 Jan 2021 10:27:52 +0800 Subject: [PATCH] pr#245 --- CHANGELOG.md | 4 +- .../java/cn/hutool/core/bean/DynaBean.java | 368 +++++++++--------- .../cn/hutool/core/bean/DynaBeanTest.java | 121 +++--- 3 files changed, 239 insertions(+), 254 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e75e2a5e7..d857c36b4 100644 --- a/CHANGELOG.md +++ b/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修复 ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/DynaBean.java b/hutool-core/src/main/java/cn/hutool/core/bean/DynaBean.java index d3ce089a9..558ce9cad 100644 --- a/hutool-core/src/main/java/cn/hutool/core/bean/DynaBean.java +++ b/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 implements Serializable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - private final Class beanClass; - private final Object bean; + 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); - } + /** + * 创建一个DynaBean + * + * @param bean 普通Bean + * @return 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); - } + /** + * 创建一个DynaBean + * + * @param beanClass Bean类 + * @return 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); - } + /** + * 创建一个DynaBean + * + * @param beanClass Bean类 + * @param params 构造Bean所需要的参数 + * @return DynaBean + */ + public static DynaBean create(Class beanClass, Object... params) { + return new DynaBean(beanClass, params); + } - //------------------------------------------------------------------------ Constructor start + //------------------------------------------------------------------------ Constructor start - /** - * 构造 - * - * @param beanClass Bean类 - * @param params 构造Bean所需要的参数 - */ - public DynaBean(Class beanClass, Object... params) { - this(ReflectUtil.newInstance(beanClass, params)); - } + /** + * 构造 + * + * @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 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 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 属性值类型 - * @param fieldName 字段名 - * @return 字段值 - * @throws BeanException 反射获取属性值或字段值导致的异常 - */ - @SuppressWarnings("unchecked") - public 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); - } - } + /** + * 获得字段对应值 + * + * @param 属性值类型 + * @param fieldName 字段名 + * @return 字段值 + * @throws BeanException 反射获取属性值或字段值导致的异常 + */ + @SuppressWarnings("unchecked") + public 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); - } + /** + * 检查是否有指定名称的bean属性 + * + * @param fieldName 字段名 + * @return 是否有bean属性 + * @since 5.4.2 + */ + public boolean containsProp(String fieldName) { + return null != BeanUtil.getBeanDesc(beanClass).getProp(fieldName); + } - /** - * 获得字段对应值,获取异常返回{@code null} - * - * @param 属性值类型 - * @param fieldName 字段名 - * @return 字段值 - * @since 3.1.1 - */ - public T safeGet(String fieldName) { - try { - return get(fieldName); - } catch (Exception e) { - return null; - } - } + /** + * 获得字段对应值,获取异常返回{@code null} + * + * @param 属性值类型 + * @param fieldName 字段名 + * @return 字段值 + * @since 3.1.1 + */ + public 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); - } - } + /** + * 设置字段值 + * + * @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 methodName 方法名 + * @param params 参数 + * @return 执行结果,可能为null + */ + public Object invoke(String methodName, Object... params) { + return ReflectUtil.invoke(this.bean, methodName, params); + } - /** - * 获得原始Bean - * - * @param Bean类型 - * @return bean - */ - @SuppressWarnings("unchecked") - public T getBean() { - return (T) this.bean; - } + /** + * 获得原始Bean + * + * @param Bean类型 + * @return bean + */ + @SuppressWarnings("unchecked") + public T getBean() { + return (T) this.bean; + } - /** - * 获得Bean的类型 - * - * @param Bean类型 - * @return Bean类型 - */ - @SuppressWarnings("unchecked") - public Class getBeanClass() { - return (Class) this.beanClass; - } + /** + * 获得Bean的类型 + * + * @param Bean类型 + * @return Bean类型 + */ + @SuppressWarnings("unchecked") + public Class getBeanClass() { + return (Class) 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 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 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(); - } + @Override + public String toString() { + return this.bean.toString(); + } } diff --git a/hutool-core/src/test/java/cn/hutool/core/bean/DynaBeanTest.java b/hutool-core/src/test/java/cn/hutool/core/bean/DynaBeanTest.java index 3a7617d58..2ff28ae30 100644 --- a/hutool-core/src/test/java/cn/hutool/core/bean/DynaBeanTest.java +++ b/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 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); + @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); + 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); + //重复包装测试 + 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); - } + //执行指定方法 + 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); + @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); + 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); + //重复包装测试 + 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{ + //执行指定方法 + 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 + "]"; - } } }