该接口用来对数据库查询到的值设置到实体对象或Map对象的属性中。
接口定义如下:
public interface ObjectWrapper {
Object get(PropertyTokenizer prop);
void set(PropertyTokenizer prop, Object value);
String findProperty(String name, boolean useCamelCaseMapping);
String[] getGetterNames();
String[] getSetterNames();
Class<?> getSetterType(String name);
Class<?> getGetterType(String name);
boolean hasSetter(String name);
boolean hasGetter(String name);
MetaObject instantiatePropertyValue(String name, PropertyTokenizer prop, ObjectFactory objectFactory);
boolean isCollection();
void add(Object element);
<E> void addAll(List<E> element);
}
实现该接口的类结构图如下所示:
![](https://img.haomeiwen.com/i5340978/345defc1dcf0529a.png)
其中CollectionWrapper只支持3个方法,其他方法都不支持,调用时会抛出UnsupportedOperationException异常:
@Override
public boolean isCollection() {
return true;
}
@Override
public void add(Object element) {
object.add(element);
}
@Override
public <E> void addAll(List<E> element) {
object.addAll(element);
}
1. BeanWrapper类
![](https://img.haomeiwen.com/i5340978/56aa433b1751f0b2.png)
从类结构图可以看出,该类继承了BaseWrapper类,其中构造函数方法签名如下:
BeanWrapper(MetaObject metaObject, Object object)
该类主要用来设置Bean对象的值:
@Override
public void set(PropertyTokenizer prop, Object value) {
if (prop.getIndex() != null) {
Object collection = resolveCollection(prop, object);
setCollectionValue(prop, collection, value);
} else {
setBeanProperty(prop, object, value);
}
}
private void setBeanProperty(PropertyTokenizer prop, Object object, Object value) {
try {
Invoker method = metaClass.getSetInvoker(prop.getName());
Object[] params = {value};
try {
method.invoke(object, params);
} catch (Throwable t) {
throw ExceptionUtil.unwrapThrowable(t);
}
} catch (Throwable t) {
throw new ReflectionException("Could not set property '" + prop.getName() + "' of '" + object.getClass() + "' with value '" + value + "' Cause: " + t.toString(), t);
}
}
3. MapWrapper类
![](https://img.haomeiwen.com/i5340978/236ca8ebe3884447.png)
该类内部维护了一个Map<String, Object> 结构的map对象,设置值的方法:
@Override
public void set(PropertyTokenizer prop, Object value) {
if (prop.getIndex() != null) {
Object collection = resolveCollection(prop, map);
setCollectionValue(prop, collection, value);
} else {
map.put(prop.getName(), value);
}
}
网友评论