博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态代理之投鞭断流
阅读量:6443 次
发布时间:2019-06-23

本文共 2643 字,大约阅读时间需要 8 分钟。

hot3.png

还是直接看代码实现吧

首先定义一个实体

public class User {    private Integer id;    private String name;    private int age;    public User(Integer id, String name, int age) {        this.id = id;        this.name = name;        this.age = age;    }    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }}

在定义一个mapper接口

public interface UserMapper {    User getUserById(Integer id);}

然后自定义一个invacationHandle

public class MapperProxy implements InvocationHandler {    /**     * 利用Proxy.newProxyInstance 获取代理类     * @param clz  目标接口     * @param 
* @return */ @SuppressWarnings("unchecked") public
T newInstance(Class
clz) { return (T) Proxy.newProxyInstance(clz.getClassLoader(), new Class[] { clz }, this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //判断method是否是Object类中定义的方法 //如 hashCode()、toString()、equals() //如果是则将target 指向 this //如果直接调用 method.invoke 会报空指针错误 if (Object.class.equals(method.getDeclaringClass())) { try { return method.invoke(this, args); } catch (Throwable t) { } } // 投鞭断流 // mybatis mapper底层实现原理 return findUserById((Integer) args[0]); } private User findUserById(Integer id) { return new User(id, "zhangsan", 18); }}

测试

public static void main(String[] args) {    MapperProxy proxy = new MapperProxy();    //获取代理类    UserMapper mapper = proxy.newInstance(UserMapper.class);    User user = 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());}

输出结果

134908_Gkf3_3737136.png

mybatis底层源码就是这么实现的,看看mybatis是怎么写的吧

@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {  try {    if (Object.class.equals(method.getDeclaringClass())) {      return method.invoke(this, args);    } else if (isDefaultMethod(method)) {      return invokeDefaultMethod(proxy, method, args);    }  } catch (Throwable t) {    throw ExceptionUtil.unwrapThrowable(t);  }  final MapperMethod mapperMethod = cachedMapperMethod(method);  return mapperMethod.execute(sqlSession, args);}

是不是很像 除了最后的return

转载于:https://my.oschina.net/u/3737136/blog/1786175

你可能感兴趣的文章
redis删除有序集合部分过期元素
查看>>
VirtuaNES.v0.97源码探究<2> 图形查看器
查看>>
我的友情链接
查看>>
fedora 系统网卡eth0异常
查看>>
JS 获取浏览器和屏幕宽高信息
查看>>
AfxBeginThread和AfxEndThread及线程资源分配和释放
查看>>
另类的图表标签
查看>>
PHP连接MSSQL数据库案例,PHPWAMP多个PHP版本连接SQL Server数据库
查看>>
执行media-relay时报ImportError: No module named application
查看>>
我的友情链接
查看>>
深入理解计算机系统-第三章阅读笔记
查看>>
vmware配置经验记录
查看>>
06、林信任快捷方式
查看>>
[Vim]以sudo权限来保存vim打开的readonly文件
查看>>
zencart 如何调用边框等
查看>>
利用飞信自动发短信脚本
查看>>
vSphere 6.5试用
查看>>
使用Oracle外部表分析访问日志
查看>>
ajax 加载页面
查看>>
贪吃蛇游戏
查看>>