得到某个method所在类
JDBC主要业务与次要业务分析
1. 加载驱动
2. 建立连接
3. 创建preparestatement
4. 执行sql命令
5. 关闭连接,preparestatement
主要业务是4,其他全是次要业务
(1)定义接口
public interface SqlSession {
public int save(String sql)throws Exception;
}
(2)接口实现类
public class DeptMapper implements SqlSession {
PreparedStatement ps;
@Override
public int save(String sql) throws SQLException {//JDBC主要业务 输送sql
int num= ps.executeUpdate(sql);
return num;
}
}
(3)通知类
public class Invaction implements InvocationHandler {
private SqlSession obj;//具体被监控对象
Connection connection ;
PreparedStatement pStatement;
public Invaction(SqlSession param){
this.obj =param;
}
@Override
public Object invoke(Object porxy, Method method, Object[] params) throws Throwable {
Object value;
//1.执行JDBC初始次要业务
init();
//2.执行JDBC主要业务
Field psField = obj.getClass().getDeclaredField("ps");
psField.setAccessible(true);
psField.set(obj, pStatement);
value= method.invoke(obj, params);
//3.执行JDBC结束次要业务
close();
return value; //返回被拦截方法,需要调用地方
}
//次要业务
private void init()throws Exception{
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/passbook", "root", "123456");
pStatement = connection.prepareStatement("");
}
private void close() throws SQLException{
if(pStatement!=null){
pStatement.close();
}
if(connection!=null){
connection.close();
}
}
}
(4)代理对象
public class SqlSessionFactory {
/*
*
* JDK动态代理模式下,代理对象的数据类型
* 应该由监控行为来描述
* 参数: Class文件,监控类
*/
public static SqlSession Builder(Class classFile)throws Exception {
//1.创建被监控实例对象
SqlSession obj= (SqlSession) classFile.newInstance();
//2.创建一个通知对象
InvocationHandler adviser= new Invaction(obj);
//3.向JVM申请负责监控obj对象指定行为的监控对象(代理对象)
/*
* loader:被监控对象隶属的类文件在内存中真实地址
* interfaces:被监控对象隶属的类文件实现接口
* h:监控对象发现小明要执行被监控行为,应该有哪一个通知对象进行辅助
*/
SqlSession $proxy= (SqlSession) Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), adviser);
return $proxy;
}
}
(5)测试类
public class TestMain {
public static void main(String[] args) throws Exception {
Map StatementMapper = new HashMap();
StatementMapper.put("dept.save", "insert into dept(dname,location) values('java','BEIJING')");
SqlSession dao = SqlSessionFactory.Builder(DeptMapper.class);
dao.save((String)StatementMapper.get("dept.save"));
}
}
得到某个method所在类的更多相关文章
- 设计模式 ( 十九 ) 模板方法模式Template method(类行为型)
设计模式 ( 十九 ) 模板方法模式Template method(类行为型) 1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行 ...
- jquery点击li 获取当前父节点所在类的索引
jquery点击li 获取当前父节点所在类的索引 $('.jbcz').find('.content li').click(function(){ //alert($('.jbcz').find('. ...
- Unity 游戏框架搭建 2019 (二十九) 方法所在类命名问题诞生的原因
我们在整理阶段解决了一些意外的问题.但是这些问题仅仅只是被解决而已,我们并没有去思考过这些问题是为什么产生的?以及在以后我们如何去避免这些问题的产生? 方法所在类的命名问题,最后我们通过方法分类解决了 ...
- Maven-打包jar指定main函数所在类的一个例子
问题描述:maven打包jar时,由于带main方法的类没有被加入manifest中,导致执行java -jar mvn-jar-1.0-SNAPSHOT.jar时,会提示没有主清单属性. 解决办法: ...
- Python的程序结构[1] -> 方法/Method[0] -> 类实例方法、私有方法和抽象方法
类实例方法.私有方法和抽象方法 Python中最常用的就是类实例方法,类似于属性中的类实例属性,同时,也存在与私有属性类似方法,即私有方法,下面介绍这两种常见的方法,以及一种特殊意义的类实例方法 -- ...
- 深入理解xLua基于IL代码注入的热更新原理
目前大部分手游都会采用热更新来解决应用商店审核周期长,无法满足快节奏迭代的问题.另外热更新能够有效降低版本升级所需的资源大小,节省玩家的时间和流量,这也使其成为移动游戏的主流更新方式之一. 热更新可以 ...
- Java编程里类的继承
今天,我们将要讨论的内容是Java里面类的继承的相关概念. 说到继承,我相信大家都不陌生.生活中,子承父业,子女继承父母的财产,这就是继承.实际上,Java里的继承也是如此.对于一个类来说,它的数据成 ...
- C#基础-事件 继承类无法直接引发基类的事件
An event can be raised only from the declaration space in which it is declared. Therefore, a class c ...
- JAVA深入研究——Method的Invoke方法。
在写代码的时候,发现Method可以调用子类的对象,但子类即使是改写了的Method,方法名一样,去调用父类的对象也会报错,虽然这是很符合多态的现象,也符合java的动态绑定规范,但还是想弄懂java ...
随机推荐
- jmeter --响应断言详解
jmeter --响应断言详解 响应断言 :对服务器的响应进行断言校验 (1)应用范围: main sample and sub sample, main sample only , sub-samp ...
- Spring Cloud Eureka Server使用(注册中心)
一.Spring Cloud Eureka 基于Netflix Eureka做了二次封装 由两个组件组成 Eureka Server 注册中心, 供服务注册的服务器 Eureka Client 服务注 ...
- Zookeeper 重连机制
Zookeeper 重连机制 public class ZKConnectSessionWatcher implements Watcher { public final static String ...
- app崩溃后自动重启
android 引用:http://blog.csdn.net/caiwenfeng_for_23/article/details/41184353 package com.tan.abnormalr ...
- 基于select类型多路IO复用,实现简单socket并发
还有很多缺限,如客户断开无限重复 以下转至老师博客: server: #!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = " ...
- <亲测>window+iis+letsencrypt+ssl 手动续期(通配符域名)
之前提到过 window环境下 生成ssl通配符域名证方法为:https://www.cnblogs.com/duanweishi/p/9491209.html 下文为在window环境下手动续 ...
- 同台同时多开DELPHI2007的解决办法
Cannot create file "C:\Users\Administrator\AppData\Local\Temp\EditorLineEnds.ttr"这个问题的产生根据 ...
- Unity3d- 资源
Data与Resources文件夹一般只读文件放到Resources目录Data用于新建的文件或者要修改的文件============================================= ...
- Redis单线程单进程为什么效率那么高
1.完全基于内存,绝大部分请求是纯粹的内存操作,非常快速.数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1): 2.数据结构简单,对数据操作也简单,Red ...
- java1.8新特性(一)
一直在更新java 版本,原来也没有关注java版本的变化 引入的一些新的api 引起注意的还是 关于一些并发包的使用,那时候才对每个版本的特性 去了解了一下,虽然 不一定都用上了,但是不管学习什 ...