Mybatis源码学习六(MetaObject)

MetaObject基本架构

Mybatis源码学习六(MetaObject)_第1张图片

MetaObject获取属性值流程

Mybatis源码学习六(MetaObject)_第2张图片

源码分析MetaObject获取属性值

public class MetaObjectTest {

    @Test
    public void test1(){
        Object blog = new Blog();
       Configuration configuration = new Configuration();
        MetaObject metaObject = configuration.newMetaObject(blog);
        User user = new User();
        user.setName("xxppp");

        ArrayList comments = new ArrayList<>();
        Comment comment = new Comment();
        comment.setUser(user);
        comments.add(comment);
        metaObject.setValue("comments",comments);
       metaObject.getValue("comments[0].user.name");
    }
}

Mybatis源码学习六(MetaObject)_第3张图片

Mybatis源码学习六(MetaObject)_第4张图片

 经过属性分词器解析

Mybatis源码学习六(MetaObject)_第5张图片

 此时hasNext()为true表示存在子属性

Mybatis源码学习六(MetaObject)_第6张图片

Mybatis源码学习六(MetaObject)_第7张图片

调用getValue,此时参数和上一次已经不一样了。为comments[0],此时没有子属性,直接调用get方法获取comments[0]的值。

Mybatis源码学习六(MetaObject)_第8张图片

 再将获取到的comments[0]值包装为MetaObject。

Mybatis源码学习六(MetaObject)_第9张图片

继续调用getValue(),此时参数为user.name。

Mybatis源码学习六(MetaObject)_第10张图片

 此时是有子属性的,为name,会进入metaObjectForProperty()。

Mybatis源码学习六(MetaObject)_第11张图片

Mybatis源码学习六(MetaObject)_第12张图片

此时user没有子属性,调用get方法获取user值

Mybatis源码学习六(MetaObject)_第13张图片 将获取到的user值包装为MetaObject。

Mybatis源码学习六(MetaObject)_第14张图片

继续调用getValue(),此时参数是name,没有子属性,直接调用get()获取name值

Mybatis源码学习六(MetaObject)_第15张图片

对BeanWrapper【get】方法单独分析

Mybatis源码学习六(MetaObject)_第16张图片

Mybatis源码学习六(MetaObject)_第17张图片

再次出现调用getValue() 

Mybatis源码学习六(MetaObject)_第18张图片

Mybatis源码学习六(MetaObject)_第19张图片

 Mybatis源码学习六(MetaObject)_第20张图片

 根据属性名,反射执行getXxx方法Mybatis源码学习六(MetaObject)_第21张图片

总结:获取属性主要是利用MetaObject中的属性分词器,和反射原理

你可能感兴趣的:(mybatis源码学习,学习)