可选参数,方法重载优先级问题

This commit is contained in:
JJZhang 2020-12-31 21:15:26 +08:00
parent d2fc1e598b
commit b612eecb33
2 changed files with 237 additions and 167 deletions

View File

@ -31,6 +31,17 @@ public class DynaBean extends CloneSupport<DynaBean> implements Serializable {
return new DynaBean(bean); return new DynaBean(bean);
} }
/**
* 创建一个{@link DynaBean}
*
* @param beanClass Bean类
* @return {@link DynaBean}
*/
public static DynaBean create(Class<?> beanClass) {
return new DynaBean(beanClass);
}
/** /**
* 创建一个{@link DynaBean} * 创建一个{@link DynaBean}
* *
@ -54,6 +65,15 @@ public class DynaBean extends CloneSupport<DynaBean> implements Serializable {
this(ReflectUtil.newInstance(beanClass, params)); this(ReflectUtil.newInstance(beanClass, params));
} }
/**
* 构造
*
* @param beanClass Bean类
*/
public DynaBean(Class<?> beanClass) {
this(ReflectUtil.newInstance(beanClass));
}
/** /**
* 构造 * 构造
* *
@ -83,7 +103,7 @@ public class DynaBean extends CloneSupport<DynaBean> implements Serializable {
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);
@ -97,7 +117,7 @@ public class DynaBean extends CloneSupport<DynaBean> implements Serializable {
* @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);
} }
@ -130,7 +150,7 @@ public class DynaBean extends CloneSupport<DynaBean> implements Serializable {
((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);

View File

@ -34,6 +34,56 @@ public class DynaBeanTest {
Assert.assertEquals("test for 李华", invoke); 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{ public static class User{
private String name; private String name;
private int age; private int age;