32、解析MetaObject
来源:互联网 发布:淘宝网主要特色 编辑:程序博客网 时间:2024/06/04 23:25
MetaObject
MetaObject类相当于一个工具类,Mybatis在sql参数设置和结果集映射里经常使用到这个对象。下面来详细分析一下这类。
字段
/** *原始的对象 */ private Object originalObject; /** * 原始对象的包装 */ private ObjectWrapper objectWrapper; private ObjectFactory objectFactory; private ObjectWrapperFactory objectWrapperFactory; private ReflectorFactory reflectorFactory;
构造方法
private MetaObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) { this.originalObject = object; this.objectFactory = objectFactory; this.objectWrapperFactory = objectWrapperFactory; this.reflectorFactory = reflectorFactory; if (object instanceof ObjectWrapper) { this.objectWrapper = (ObjectWrapper) object; } else if (objectWrapperFactory.hasWrapperFor(object)) { this.objectWrapper = objectWrapperFactory.getWrapperFor(this, object); } else if (object instanceof Map) { this.objectWrapper = new MapWrapper(this, (Map) object); } else if (object instanceof Collection) { this.objectWrapper = new CollectionWrapper(this, (Collection) object); } else { this.objectWrapper = new BeanWrapper(this, object); } }
从objectWrapper获取属性值
public Object getValue(String name) { PropertyTokenizer prop = new PropertyTokenizer(name); if (prop.hasNext()) { MetaObject metaValue = metaObjectForProperty(prop.getIndexedName()); if (metaValue == SystemMetaObject.NULL_META_OBJECT) { return null; } else { return metaValue.getValue(prop.getChildren()); } } else { return objectWrapper.get(prop); } }
设置objectWrapper属性值
public void setValue(String name, Object value) { PropertyTokenizer prop = new PropertyTokenizer(name); if (prop.hasNext()) { MetaObject metaValue = metaObjectForProperty(prop.getIndexedName()); if (metaValue == SystemMetaObject.NULL_META_OBJECT) { if (value == null && prop.getChildren() != null) { // don't instantiate child path if value is null return; } else { metaValue = objectWrapper.instantiatePropertyValue(name, prop, objectFactory); } } metaValue.setValue(prop.getChildren(), value); } else { objectWrapper.set(prop, value); } }
MetaObject主要是封装了objectWrapper对象,提供了get和set的方法用于获取和设置objectWrapper的属性值。
objectWrapper
objectWrapper的实现有3种方式 MapWrapper
BeanWrapper
CollectionWrapper
MapWrapper
““java
@Override
public Object get(PropertyTokenizer prop) {
if (prop.getIndex() != null) {
Object collection = resolveCollection(prop, map);
return getCollectionValue(prop, collection);
} else {
return map.get(prop.getName());
}
}
@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);
}
}
““
BeanWrapper
public Object get(PropertyTokenizer prop) { if (prop.getIndex() != null) { Object collection = resolveCollection(prop, object); return getCollectionValue(prop, collection); } else { return getBeanProperty(prop, object); } }
CollectionWrapper
@Override public Object get(PropertyTokenizer prop) { throw new UnsupportedOperationException(); } @Override public void set(PropertyTokenizer prop, Object value) { throw new UnsupportedOperationException(); }
其中objectWrapper最主要的有三种类型:
1. Map类型
2. Collection类型
3. 普通的java对象,有get和set方法的对象
- 32、解析MetaObject
- Mybatis3源码分析(12)-Sql解析执行-MetaObject
- error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __thiscall Widget::metaObject
- error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __thiscall Widget::metaObject
- error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __thiscall Widget::metaObject
- error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __cdecl MainWindow::metaObject(
- m_signalArgumentTypes.contains(object->metaobject())
- Mybatis——MetaObject学习
- Mybatis——MetaObject学习
- Qt MetaObject System-- 元对象系统
- Qt MetaObject 详解之一:简单介绍
- Qt MetaObject 详解之二:QMeta数据以及数据结构信息
- QT手动moc问题:virtual struct QMetaObject const * __thiscall Widget::metaObject
- QT手动moc问题:virtual struct QMetaObject const * __thiscall Widget::metaObject
- QT手动生成moc问题:virtual struct QMetaObject const * __thiscall Widget::metaObject
- 解析
- 解析
- 解析
- ES6规范大全
- 文章标题
- Angular2 父子路由问题
- 31、propertise解析之通用标记解析器与标记处理器
- uml关联符号说明
- 32、解析MetaObject
- Android基础--ListView的显示几种方式
- 1001. 求高精度幂
- 快速Android开发系列网络篇之Android-Async-Http
- 新的启程,新的进步。
- 33、SQL解析基础
- 《操作系统真象还原》-阅读笔记(中)
- 34、SqlSource解析
- Maven ProfileFilter 分环境运行