运维开发网

从Mybatis谈ObjectWrapper的使用

运维开发网 https://www.qedev.com 2022-05-26 15:27 出处:网络
本文主要介绍了Mybatis反射之ObjectWrapper的使用,文中根据实例编码详细介绍的十分详尽,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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


获取类属性的类MetaClass

元类主要用于获取类的属性。在其构造方法中,类被反射器工厂封装到反射器中。

private MetaClass(Classlt;?gt; type, ReflectorFactory reflectorFactory) { this.reflectorFactory = reflectorFactory; this.reflector = reflectorFactory.findForClass(type); }

元类的findProperty()是获取属性的方法。此外,它还有判断该属性是否有getter setter方法的功能:

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()方法,也相对简单。

? private final Collectionlt;Objectgt; object;? @Override? public boolean isCollection() {? ? return true;? }? @Override? public void add(Object element) {? ? object.add(element);? }? @Override? public lt;Egt; void addAll(Listlt;Egt; element) {? ? object.addAll(element);? }

抽象类BaseWrapper实现了ObjectWrapper接口和resolveCollection方法:它的作用是把指定的属性变成对象并返回。

protected Object resolveCollection(PropertyTokenizer prop, Object object) { if ("".equals(prop.getName())) { return object; } else { // 这里会循环调用,解析下层 return metaObject.getValue(prop.getName()); } }

还实现了getCollectionValue()和setCollectionValue()方法。

这里用的是元对象,用来记录元数据。

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

@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来存储操作。


总结

这篇文章比较简单。主要解释了获取类属性的类元类。其方法主要依靠PropertyTokenizer类进行分析。此外,还分析了封装对象元信息的接口ObjectWrapper。其实现类包括CollectionWrapper和BaseWrapper抽象类。BaseWrapper下有BeanWrapper、MapWrapper等子类。BeanWrapper实现get set方法获取属性值或设置属性值,而MapWrapper主要使用map结构存储对象元信息。

关于Mybatis Reflective ObjectWrapper的使用,本文到此结束。关于Mybatis Reflective ObjectWrapper的更多信息

0

精彩评论

暂无评论...
验证码 换一张
取 消