From b612eecb338ae2301e9dc95832abe583f91ca548 Mon Sep 17 00:00:00 2001 From: JJZhang Date: Thu, 31 Dec 2020 21:15:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=AF=E9=80=89=E5=8F=82=E6=95=B0=EF=BC=8C?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E9=87=8D=E8=BD=BD=E4=BC=98=E5=85=88=E7=BA=A7?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/core/bean/DynaBean.java | 354 +++++++++--------- .../cn/hutool/core/bean/DynaBeanTest.java | 50 +++ 2 files changed, 237 insertions(+), 167 deletions(-) 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 bf8280288..d3ce089a9 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,187 +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); - } + /** + * 创建一个{@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); - } + /** + * 创建一个{@link DynaBean} + * + * @param beanClass Bean类 + * @return {@link DynaBean} + */ + public static DynaBean create(Class beanClass) { + return new DynaBean(beanClass); + } - //------------------------------------------------------------------------ Constructor start - /** - * 构造 - * - * @param beanClass Bean类 - * @param params 构造Bean所需要的参数 - */ - public DynaBean(Class beanClass, Object... params) { - this(ReflectUtil.newInstance(beanClass, params)); - } + /** + * 创建一个{@link DynaBean} + * + * @param beanClass Bean类 + * @param params 构造Bean所需要的参数 + * @return {@link DynaBean} + */ + public static DynaBean create(Class beanClass, Object... params) { + return new DynaBean(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 + //------------------------------------------------------------------------ Constructor start - /** - * 获得字段对应值 - * - * @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 beanClass Bean类 + * @param params 构造Bean所需要的参数 + */ + public DynaBean(Class beanClass, Object... params) { + this(ReflectUtil.newInstance(beanClass, params)); + } - /** - * 检查是否有指定名称的bean属性 - * - * @param fieldName 字段名 - * @return 是否有bean属性 - * @since 5.4.2 - */ - public boolean containsProp(String fieldName){ - return null != BeanUtil.getBeanDesc(beanClass).getProp(fieldName); - } + /** + * 构造 + * + * @param beanClass Bean类 + */ + public DynaBean(Class beanClass) { + this(ReflectUtil.newInstance(beanClass)); + } - /** - * 获得字段对应值,获取异常返回{@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 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 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 属性值类型 + * @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 methodName 方法名 - * @param params 参数 - * @return 执行结果,可能为null - */ - public Object invoke(String methodName, Object... params) { - return ReflectUtil.invoke(this.bean, methodName, params); - } + /** + * 检查是否有指定名称的bean属性 + * + * @param fieldName 字段名 + * @return 是否有bean属性 + * @since 5.4.2 + */ + public boolean containsProp(String fieldName) { + return null != BeanUtil.getBeanDesc(beanClass).getProp(fieldName); + } - /** - * 获得原始Bean - * - * @param Bean类型 - * @return bean - */ - @SuppressWarnings("unchecked") - public T getBean() { - return (T) this.bean; - } + /** + * 获得字段对应值,获取异常返回{@code null} + * + * @param 属性值类型 + * @param fieldName 字段名 + * @return 字段值 + * @since 3.1.1 + */ + public T safeGet(String fieldName) { + try { + return get(fieldName); + } catch (Exception e) { + return null; + } + } - /** - * 获得Bean的类型 - * - * @param Bean类型 - * @return Bean类型 - */ - @SuppressWarnings("unchecked") - public Class getBeanClass() { - return (Class) this.beanClass; - } + /** + * 设置字段值 + * + * @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); + } + } - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((bean == null) ? 0 : bean.hashCode()); - return result; - } + /** + * 执行原始Bean中的方法 + * + * @param methodName 方法名 + * @param params 参数 + * @return 执行结果,可能为null + */ + public Object invoke(String methodName, Object... params) { + return ReflectUtil.invoke(this.bean, methodName, params); + } - @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); - } + /** + * 获得原始Bean + * + * @param Bean类型 + * @return bean + */ + @SuppressWarnings("unchecked") + public T getBean() { + return (T) this.bean; + } - @Override - public String toString() { - return this.bean.toString(); - } + /** + * 获得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 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(); + } } 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 de54d20c7..3a7617d58 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 @@ -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;