MyBatis源码解析--基础支持层(3)

MetaObject 提供了对象的属性值的获取与设置等方法,是对BaseWrapper操作的进一步增强

public class MetaObject {
   
   

  //原始的java对象
  private final Object originalObject;
  //对对象的包装,抽象了对象的属性信息,他定义了一系列查询对象属性信息的方法,以及更新属性的方法;
  private final ObjectWrapper objectWrapper;
  private final ObjectFactory objectFactory;
  private final ObjectWrapperFactory objectWrapperFactory;
  private final ReflectorFactory reflectorFactory;

  private MetaObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) {
   
   
    this.originalObject = object;
    this.objectFactory = objectFactory;
    this.objectWrapperFactory = objectWrapperFactory;
    this.reflectorFactory = reflectorFactory;
//会根据object类型的不同创造相应的ObjectWrapper对象
    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);
    }
  }
//静态方法,创造MetaObject对象
  public static MetaObject forObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) {
   
   
    if (object == null) {
   
   
      return SystemMetaObject.NULL_META_OBJECT;
    } else {
   
   
      return new MetaObject(object, objectFactory, objectWrapperFactory, reflectorFactory);
    }
  }

  public ObjectFactory getObjectFactory() {
   
   
    return objectFactory;
  }

  public ObjectWrapperFactory getObjectWrapperFactory() {
   
   
    return objectWrapperFactory;
  }

  public ReflectorFactory getReflectorFactory() {
   
   
	return reflectorFactory;
  }

  public Object getOriginalObject() {
   
   
    return originalObject;
  }

  public String findProperty(String propName, boolean useCamelCaseMapping) {
   
   
    return objectWrapper.findProperty(propName, useCamelCaseMapping);
  }

  public String[] getGetterNames() {
   
   
    return objectWrapper.getGetterNames();
  }

  public String[] getSetterNames() {
   
   
    return objectWrapper.getSetterNames();
  }

  public Class<?> getSetterType(String name) {
   
   
    return objectWrapper.getSetterType(name);
  }

  public Class<?> getGetterType(String name) {
   
   
    return objectWrapper.getGetterType(name);
  }

  public boolean hasSetter(String name) {
   
   
    return objectWrapper.hasSetter(name);
  }

  public boolean hasGetter(String name) {
   
   
    return objectWrapper.hasGetter(name);
  }
//获得指定属性的值
  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);
    }
  }
//设置对应属性的值
  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对象
  public MetaObject metaObjectForProperty(String name) {
   
   
    Object value = getValue(name);
    return MetaObject.forObject(value, objectFactory, objectWrapperFactory, reflectorFactory);
  }

  public ObjectWrapper getObjectWrapper() {
   
   
    return objectWrapper;
  }

  public boolean isCollection() {
   
   
    return objectWrapper.isCollection();
  }

  public void add(Object element) {
   
   
    objectWrapper.add(element);
  }

  public <E> void addAll(List<E> list) {
   
   
    objectWrapper.addAll(list);
  }

}

SystemMetaObject 系统级的MetaObject对象,主要提供了 ObjectFactory、ObjectWrapperFactory、空 MetaObject 的单例

public final class SystemMetaObject {
   
   

  public static final ObjectFactory DEFAULT_OBJECT_FACTORY = new DefaultObjectFactory();
  public static final ObjectWrapperFactory DEFAULT_OBJECT_WRAPPER_FACTORY = new DefaultObjectWrapperFactory();
  public static final MetaObject NULL_META_OBJECT = MetaObject.forObject(NullObject.class, DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY, new DefaultReflectorFactory());

  private SystemMetaObject() {
   
   
    // Prevent Instantiation of Static Class
  }

  private static class NullObject {
   
   
  }
//创建指定对象的MetaObject对象
  public static MetaObject forObject(Object object) {
   
   
    return MetaObject.forObject(object, DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY, new DefaultReflectorFactory());
  }

}

ParamNameUtil 参数名工具类,获得构造方法和普通方法的参数列表

public class ParamNameUtil {
   
   
  public static List<String> getParamNames(Method method) {
   
   
    return getParameterNames(method);
  }

  public static List<String> getParamNames(Constructor<?> constructor) {
   
   
    return getParameterNames(constructor);
  }

  private static List<String> getParameterNames(Executable executable) {
   
   
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值