DWR中采用DefaultContainer来加载默认的配置信息,下面是我的实现:
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
public class CantainerTest {
public static void main(String[] args) {
Cantainer cant = new Cantainer();
try {
cant.addParam("name", "can_name");
cant.addParam("bool", "true");
cant.addParam("age", "111");
cant.addParam("beanOne", new BeanOne());
cant.addParam(BeanTwo.class.getName(), "BeanTwo");
cant.finishConfig();
System.out.println(cant.getBean("name"));
System.out.println(cant.getBean("bool"));
System.out.println(cant.getBean("age"));
System.out.println(cant.getBean("beanOne"));
System.out.println(cant.getBean(BeanTwo.class.getName()));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class Cantainer {
private Map<String, Object> beans = new HashMap<String, Object>();
public void addParam(String key, Object value) throws Exception {
if (value instanceof String) {
try {
Class impl = Class.forName((String) value);
value = impl.newInstance();
} catch (ClassNotFoundException e) {
}
}
beans.put(key, value);
}
public void finishConfig() throws Exception {
Collection<Object> col = beans.values();
for (Object obj : col) {
if (!(obj instanceof String)) {
// 开始自动匹配
BeanInfo bi = Introspector.getBeanInfo(obj.getClass());
for (PropertyDescriptor desc : bi.getPropertyDescriptors()) {
Object value = beans.get(desc.getName());
if (value != null) {
Method setter = desc.getWriteMethod();
Class propType = setter.getParameterTypes()[0];
boolean invokeFlg = false;
if (value.getClass().isAssignableFrom(propType)) {
invokeFlg = true;
} else if (propType == Boolean.TYPE && value.getClass() == String.class) {
value = Boolean.valueOf((String) value);
invokeFlg = true;
} else if (propType == Integer.TYPE && value.getClass() == String.class) {
value = Integer.valueOf((String) value);
invokeFlg = true;
} else if (propType == Boolean.TYPE && value.getClass() == String.class) {
value = Boolean.valueOf((String) value);
invokeFlg = true;
}
if (invokeFlg) {
setter.invoke(obj, new Object[] { value });
}
}
}
}
}
}
public Object getBean(String key) {
return beans.get(key);
}
}
class BeanOne {
public BeanOne() {
super();
this.name = "name";
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return "BeanOne name:" + this.name;
}
}
class BeanTwo {
private BeanOne beanOne;
private boolean bool;
private int age;
public BeanTwo() {
this.beanOne = new BeanOne();
this.bool = false;
this.age = 123;
}
public BeanOne getBeanOne() {
return beanOne;
}
public void setBeanOne(BeanOne beanOne) {
this.beanOne = beanOne;
}
public boolean isBool() {
return bool;
}
public void setBool(boolean bool) {
this.bool = bool;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "BeanTwo beanOne:<" + this.beanOne + "> bool:" + this.bool + " age:" + this.age;
}
}
输出如下:
can_name
true
111
BeanOne name:can_name
BeanTwo beanOne:<BeanOne name:can_name> bool:true age:111