• java高级架构师教程-投鞭断流实现自动映射器Mapper


    图灵学院  java高级架构师教程-投鞭断流实现自动映射器Mapper

    首先定义一个pojo。

     java架构师学习路线

        再定义一个接口UserMapper.java。

        publicinterfaceUserMapper{

        publicUsergetUserById(Integerid);

        }

        接下来我们看看如何使用动态代理之投鞭断流,实现实例化接口并调用接口方法返回数据的。

        自定义一个InvocationHandler。

        importjava.lang.reflect.InvocationHandler;

        importjava.lang.reflect.Method;

        importjava.lang.reflect.Proxy;

        publicclassMapperProxyimplementsInvocationHandler{

        @SuppressWarnings("unchecked")

        public<T>TnewInstance(Class<T>clz){

        return(T)Proxy.newProxyInstance(clz.getClassLoader(),newClass[]{clz},this);

        }

        @Override

        publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{

        if(Object.class.equals(method.getDeclaringClass())){

        try{

        //诸如hashCode()、toString()、equals()等方法,将target指向当前对象this

        returnmethod.invoke(this,args);

        }catch(Throwablet){

        }

        }

        //投鞭断流

        returnnewUser((Integer)args[0],"zhangsan",18);

        }

        }

        上面代码中的target,在执行Object.java内的方法时,target被指向了this,target已经变成了傀儡、象征、占位符。在投鞭断流式的拦截时,已经没有了target。

        写一个测试代码:

        publicstaticvoidmain(String[]args){

        MapperProxyproxy=newMapperProxy();

        UserMappermapper=proxy.newInstance(UserMapper.class);

        Useruser=mapper.getUserById(1001);

        System.out.println("ID:"+user.getId());

        System.out.println("Name:"+user.getName());

        System.out.println("Age:"+user.getAge());

        System.out.println(mapper.toString());

        }

        output:

        ID:1001

        Name:zhangsan

        Age:18

        x.y.MapperProxy@6bc7c054

        这便是Mybatis自动映射器Mapper的底层实现原理。

        可能有读者不禁要问:你怎么把代码写的像初学者写的一样?没有结构,且缺乏美感。

        必须声明,作为一名经验老道的高手,能把程序写的像初学者写的一样,那必定是高手中的高手。这样可以让初学者感觉到亲切,舒服,符合自己的Style,让他们或她们,感觉到大牛写的代码也不过如此,自己甚至写的比这些大牛写的还要好,从此自信满满,热情高涨,认为与大牛之间的差距,仅剩下三分钟。

    如果你想了解更多关于java架构师的专业知识,可以一起交流:11604这里面都是同行05674,有资源分享包括但不限于(分布式架构、高可扩展、高性能、高并 发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql 、Zookeeper、Tomcat、Docker、Dubbo、Nginx)。欢迎一到五年的工程师加入,合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

  • 相关阅读:
    虚拟研讨会:如何设计好的RESTful API(转)
    六百字读懂 Git(转)
    情侣相处最佳模式(转)
    UML初览(转)
    日志分析方法概述(转)
    病入膏肓的叮咚小区还有救吗?(转)
    基于Django的Disqus如何支持每月80亿PV(转)
    高质量代码三要素:可读性、可维护性、可变更性(转)
    如何提高代码质量(转)
    管理神话之一:得不偿失的100%利用(转)
  • 原文地址:https://www.cnblogs.com/tulingxueyuan/p/14087631.html
Copyright © 2020-2023  润新知