目录
获取类属性的类MetaClassObjectWrapper总结获取类属性的类MetaClass
MetaClass主要是用于获取类的属性,它的构造方法中通过ReflectorFactory工厂把class封装成Reflector
private MetaClass(Class> type, ReflectorFactory reflectorFactory) {
this.reflectorFactory = reflectorFactory;
this.reflector = reflectorFactory.findForClass(type);
}MetaClass的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 Collection
BaseWrapper抽象类实现了ObjectWrapper接口,实现了resolveCollection方法:功能是将指定的属性转为对象返回
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方法,主要功能是获取相应的属性值和设置相应的属性值。
@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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
X 关闭
X 关闭
- 15G资费不大降!三大运营商谁提供的5G网速最快?中国信通院给出答案
- 2联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 3亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 4现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 5如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 6AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 7转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 8充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 9好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 10名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?

