服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - 聊聊Mybatis反射之ObjectWrapper的使用

聊聊Mybatis反射之ObjectWrapper的使用

2022-10-13 12:46周杰倫本人 Java教程

本文主要介绍了Mybatis反射之ObjectWrapper的使用,文中根据实例编码详细介绍的十分详尽,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

获取类属性的类MetaClass

MetaClass主要是用于获取类的属性,它的构造方法中通过ReflectorFactory工厂把class封装成Reflector

?
1
2
3
4
private MetaClass(Class<?> type, ReflectorFactory reflectorFactory) {
    this.reflectorFactory = reflectorFactory;
    this.reflector = reflectorFactory.findForClass(type);
  }

MetaClass的findProperty()就是获取属性的方法,另外它还有判断这个属性有没有getter setter方法的功能:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public boolean hasSetter(String name) {
    PropertyTokenizer prop = new PropertyTokenizer(name);
    if (prop.hasNext()) {
      if (reflector.hasSetter(prop.getName())) {
        MetaClass metaProp = metaClassForProperty(prop.getName());
        return metaProp.hasSetter(prop.getChildren());
      } else {
        return false;
      }
    } else {
      return reflector.hasSetter(prop.getName());
    }
  }
 
  public boolean hasGetter(String name) {
    PropertyTokenizer prop = new PropertyTokenizer(name);
    if (prop.hasNext()) {
      if (reflector.hasGetter(prop.getName())) {
        MetaClass metaProp = metaClassForProperty(prop);
        return metaProp.hasGetter(prop.getChildren());
      } else {
        return false;
      }
    } else {
      return reflector.hasGetter(prop.getName());
    }
  }

通过源码我们知道,这两个方法主要依赖于PropertyTokenizer来进行解析。

ObjectWrapper

ObjectWrapper是用来封装对象元信息的接口, CollectionWrapper实现ObjectWrapper接口,实现了add(),addAll()和isCollection()方法,也比较简单。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  private final Collection<Object> object;
  @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);
  }

BaseWrapper抽象类实现了ObjectWrapper接口,实现了resolveCollection方法:功能是将指定的属性转为对象返回

?
1
2
3
4
5
6
7
8
protected Object resolveCollection(PropertyTokenizer prop, Object object) {
    if ("".equals(prop.getName())) {
      return object;
    } else {
      // 这里会循环调用,解析下层
      return metaObject.getValue(prop.getName());
    }
  }

同时还实现了getCollectionValue()和setCollectionValue()方法

这里用到MetaObject,MetaObject用来记录元数据

BeanWrapper继承BaseWrapper,实现了ObjectWrapper接口的get set方法,主要功能是获取相应的属性值和设置相应的属性值。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Override
  public Object get(PropertyTokenizer prop) {
    if (prop.getIndex() != null) {
      // 不是单一属性,而是有数组
      Object collection = resolveCollection(prop, object);
      return getCollectionValue(prop, collection);
    } else {
      return getBeanProperty(prop, object);
    }
  }
 
  @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);
    }
  }

MapWrapper也是继承BaseWrapper,和BeanWrapper的区别是用map来存储操作的

总结

这篇文章比较简单,主要讲解了一下获取类属性的类MetaClass,它的方法主要依赖于PropertyTokenizer类来进行解析,另外分析了一下封装对象元信息的接口ObjectWrapper,它的实现类有CollectionWrapper,BaseWrapper抽象类,BaseWrapper下的有BeanWrapper和MapWrapper等等子类,BeanWrapper实现get set方法来获取属性值或者设置属性值,而MapWrapper主要是用map结构来进行存储对象元信息。

到此这篇关于聊聊Mybatis反射之ObjectWrapper的使用的文章就介绍到这了,更多相关Mybatis反射ObjectWrapper内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/7077152042019454990

延伸 · 阅读

精彩推荐