!245 DynaBean.create 方法重载参数匹配问题

Merge pull request !245 from jjzhangjj/v5-dev
This commit is contained in:
Looly 2021-01-02 10:24:20 +08:00 committed by Gitee
commit 6837180fc6
2 changed files with 237 additions and 167 deletions

View File

@ -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 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 <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);
}
}
/**
* 构造
*
* @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 <T> 属性值类型
* @param fieldName 字段名
* @return 字段值
* @since 3.1.1
*/
public <T> 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 <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 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 <T> Bean类型
* @return bean
*/
@SuppressWarnings("unchecked")
public <T> T getBean() {
return (T) this.bean;
}
/**
* 获得字段对应值获取异常返回{@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;
}
}
/**
* 获得Bean的类型
*
* @param <T> Bean类型
* @return Bean类型
*/
@SuppressWarnings("unchecked")
public <T> Class<T> getBeanClass() {
return (Class<T>) 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 <T> Bean类型
* @return bean
*/
@SuppressWarnings("unchecked")
public <T> T getBean() {
return (T) this.bean;
}
@Override
public String toString() {
return this.bean.toString();
}
/**
* 获得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();
}
}

View File

@ -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;