- 拦截方法入参是一种可配置操作 , 比如 @This Object obj 是为了获取当前类的执行对象 , @Origin Method method 是为了获取执行方法 。
- 在 finally 块中 , 我们可以通过反射拿到当前类的属性信息 , 以及反射拿到执行的 SQL , 并做打印输出 。
在测试和开发 IDEA Plugin 插件之前 , 我们需要先进行一个打包操作 , 这个打包就是把字节码增强的代码打包整一个 Jar 包 。在 build.gradle -> shadowJar
文章插图
- 打包编译后 , 就可以在 build -> libs 下看到 jar:probe-agent-1.0-SNAPSHOT-all.jar 这个 Jar 就是用来做字节码增强处理的 。
这里在把写好的字节码增强组件给插件使用之前 , 可以做一个测试验证 , 避免每次都需要启动插件才能做测试 。
单元测试
public class ApiTest { public static void main(String[] args) throws Exception { String URL = "jdbc:mysql://127.0.0.1:3306/itstack?characterEncoding=utf-8"; String USER = "root"; String PASSword = "123456"; Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); String sql="SELECT * FROM USER WHERE id = ? AND name = ?"; PreparedStatement statement = conn.prepareStatement(sql); statement.setLong(1,1L); statement.setString(2,"谢飞机"); ResultSet rs = statement.executeQuery(); while (rs.next()) { System.out.println(rs.getString("name") + " " + rs.getString("address")); } } }
- VM options:-javaagent:你的路径libsprobe-agent-1.0-SNAPSHOT-all.jar
- 注意在测试运行的时候 , 你要给 ApiTest 配置 VM options 才能打印拦截 SQL 信息
测试结果
原始SQL: SELECT * FROM USER WHERE id = ? AND name = ? 替换SQL: SELECT * FROM USER WHERE id = 1 AND name = '谢飞机' 谢飞机 北京.大兴区.通明湖公园
- 好啦 , 这样我们就可以拦截可以复制执行的 SQL 语句了 , 接下来我们再做下 IDEA Plugin 的处理 。
接下来我们要把开发好的字节码增强 Jar 包 , 复制到 IDEA Plugin 插件开发模块中的 libs(可自己创建) 下 , 之后在 plugin.xml 配置加载 implementation fileTree(dir: 'libs', includes: ['*jar']) 这样就可以程序中 , 找到这个 jar 包并配置到程序中 。
3.1 复制 jar 到 libs 下
文章插图
3.2 build.gradle 配置加载
dependencies { implementation fileTree(dir: 'libs', includes: ['*jar']) }
- 通过 implementation fileTree 引入加载文件树的方式 , 把我们配置好的 Jar 加载到程序运行中 。
cn.bugstack.guide.idea.plugin.PerRun
public class PerRun extends JavaProgramPatcher { @Override public void patchJavaParameters(Executor executor, RunProfile configuration, JavaParameters javaParameters) { RunConfiguration runconfiguration = (RunConfiguration) configuration; ParametersList vmParametersList = javaParameters.getVMParametersList(); vmParametersList.addParametersString("-javaagent:" + agentCoreJarPath); vmParametersList.addNotEmptyProperty("guide-idea-plugin-probe.projectId", runConfiguration.getProject().getLocationHash()); } }
- 通过继承 JavaProgramPatcher 类 , 实现 patchJavaParameters 方法 , 通过 configuration 属性来配置我们自己需要被加载的 -javaagent 包 。
- 这样在通过 IDEA 已经安装此插件 , 运行代码的时候 , 就会执行到这个拦截和打印 SQL 的功能 。
- 之后你还需要把开发好的加载类 , 配置到 java.programPatcher 这样就可以程序运行的时候 , 被加载到了 。
- 准备好一个有数据库操作的工程 , 需要的是 JDBC , 如果是其他的 , 你需要自己扩展
- 启动插件后 , 打开你的工程 , 运行单元测试 , 查看打印区
启动插件
推荐阅读
- 打印机安装了连供,墨水不进墨盒怎么办 连供墨水怎么加墨
- 烧饼夹菜图片高清_烧饼夹菜的简单的方式?
- 铝合金特种焊接方式 特种焊接
- xp打印后台程序服务没有运行;已启动Print Spooler,但是添加网络打印机时还是提示“本地后台打印程序服务没有运行”?
- 3d打印机根据什么挑选比较好? 3d模型打印机
- 边亮|打开生活的正确方式:有钱人的中年危机,普通人看不懂
- 打开生活的正确方式|《打开生活的正确方式》最强打工人?文草草的逆袭之路从不简单!
- 人与人|《打开生活的正确方式》最强打工人?文草草的逆袭之路从不简单!
- 训练方式不容有误 能力训练
- 边亮|《打开生活的正确方式》:从边亮失去副总职位,看出廖为智的心机