Mybatis源码学习六MetaObject

导读:本篇文章讲解 Mybatis源码学习六MetaObject,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

MetaObject基本架构

Mybatis源码学习六MetaObject

MetaObject获取属性值流程

Mybatis源码学习六MetaObject

源码分析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<Comment> 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

Mybatis源码学习六MetaObject

 经过属性分词器解析

Mybatis源码学习六MetaObject

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

Mybatis源码学习六MetaObject

Mybatis源码学习六MetaObject

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

Mybatis源码学习六MetaObject

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

Mybatis源码学习六MetaObject

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

Mybatis源码学习六MetaObject

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

Mybatis源码学习六MetaObject

Mybatis源码学习六MetaObject

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

Mybatis源码学习六MetaObject 将获取到的user值包装为MetaObject。

Mybatis源码学习六MetaObject

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

Mybatis源码学习六MetaObject

对BeanWrapper【get】方法单独分析

Mybatis源码学习六MetaObject

Mybatis源码学习六MetaObject

再次出现调用getValue() 

Mybatis源码学习六MetaObject

Mybatis源码学习六MetaObject

 Mybatis源码学习六MetaObject

 根据属性名,反射执行getXxx方法Mybatis源码学习六MetaObject

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/1264.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!