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方法的对象

阅读全文
0 0
原创粉丝点击