我不知道咋拦截,我想不修改源代码的情况下进行拦截增强,我发现使用cglib需要手动使用Enhancer#create()方法创建一个代理类,手动调用才能触发Callback的钩子函数
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
}
}
自己代理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) 设置子健