mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-05-09 23:51:34 +08:00
pr#245
This commit is contained in:
parent
6837180fc6
commit
387845b869
@ -3,9 +3,11 @@
|
|||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
# 5.5.7 (2020-12-29)
|
# 5.5.7 (2021-01-02)
|
||||||
|
|
||||||
### 新特性
|
### 新特性
|
||||||
|
* 【core 】 DynaBean.create增加重载方法(pr#245@Gitee)
|
||||||
|
|
||||||
### Bug修复
|
### Bug修复
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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 + "]";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user