This commit is contained in:
Looly 2021-01-02 10:27:52 +08:00
parent 6837180fc6
commit 387845b869
3 changed files with 239 additions and 254 deletions

View File

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

View File

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

View File

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