当前位置: 首页 > 知识库问答 >
问题:

cglib怎么拦截java.sql.Statement类?

彭博厚
2023-05-05

我不知道咋拦截,我想不修改源代码的情况下进行拦截增强,我发现使用cglib需要手动使用Enhancer#create()方法创建一个代理类,手动调用才能触发Callback的钩子函数

共有2个答案

房泉
2023-05-05

1.用 CGLIB 对 java.sql.Statement 类来进行拦截增强:

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;
import java.sql.Statement;

public class StatementInterceptor implements MethodInterceptor {

    private Statement statement;

    public StatementInterceptor(Statement statement) {
        this.statement = statement;
    }

    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("Before invoking " + method.getName());
        Object result = method.invoke(statement, args);
        System.out.println("After invoking " + method.getName());
        return result;
    }

    public static Statement createProxy(Statement statement) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(Statement.class);
        enhancer.setCallback(new StatementInterceptor(statement));
        return (Statement) enhancer.create();
    }

    public static void main(String[] args) throws Exception {
        // Assuming you have an actual Statement object named 'statement'
        Statement statement = ...;

        Statement proxyStatement = StatementInterceptor.createProxy(statement);
        // Use proxyStatement instead of the original 'statement' object
    }
}
乔宏峻
2023-05-05

自己代理connection,返回Statement的方法你返回代理对象就行了
只要你改造datasource的getConnection方法,业务代码不需要改动

 类似资料:
  • 我正在具体的类上创建动态代理。因为Java的普通代理类只对接口有帮助,所以我选择了cglib。 我使用带有MethodInterceptor的增强器类来拦截我的代理的方法,我能够拦截除静态方法之外的所有方法调用。 有什么方法可以使用cglib拦截对静态方法的调用吗?

  • Spring文档说明: 输出: 同样-通过实验-CGLIB库(不使用spring,使用增强器类)也允许代理包级方法。 更新 我想我找到了接受公共方法的这种行为只会发生的地方。它发生在处,这是切入点()使用的。 来自代码:

  • 拦截文件 bp CreateFileA 创建或打开文件 (32位) bp OpenFile 打开文件 (32位) bp ReadFile 读文件 (32位) bp WriteFile 写文件 (32位) bp GetPrivateProfileStringA (ini文件)

  • 拦截时间 bp GetLocalTime 获取本地时间 bp GetSystemTime 获取系统时间 bp GetFileTime 获取文件时间 bp GetTickCount 获得自系统成功启动以来所经历的毫秒数 bp GetCurrentTime 获取当前时间(16位) bp SetTimer 创建定时器 bp TimerProc 定时器超时回调函数

  • 拦截窗口 bp CreateWindow 创建窗口 bp CreateWindowEx(A) 创建窗口 bp ShowWindow 显示窗口 bp UpdateWindow 更新窗口 bp GetWindowText(A) 获取窗口文本

  • 拦截注册表 bp RegOpenKey(A) 打开子健 bp RegOpenKeyEx 打开子健 bp RegQueryValue(A) 查找子健 bp RegQueryValueEx 查找子健 bp RegSetValue(A) 设置子健 bp RegSetValueEx(A) 设置子健