图灵学院 java高级架构师教程-投鞭断流实现自动映射器Mapper
首先定义一个pojo。
再定义一个接口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)。欢迎一到五年的工程师加入,合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!