要使用 CGLIB 对某个对象的某个方法进行代理和增强,可以使用 Enhancer
类。CGLIB 通过生成目标类的子类,并在方法调用时插入自定义的逻辑来实现这一目的。下面是一个示例,展示如何对某个对象的特定方法进行代理和增强。
示例代码
1. 添加 CGLIB 依赖
在 Maven 项目中,添加 CGLIB 的依赖:
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
2. 创建目标类
创建一个目标类,其中包含要增强的方法。
public class MyService {
public void performTask() {
System.out.println("Performing task...");
}
public void otherTask() {
System.out.println("Performing other task...");
}
}
3. 创建代理类
使用 CGLIB 的 Enhancer
类来创建代理,并在方法调用前后插入自定义逻辑。
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class MyServiceInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
if (method.getName().equals("performTask")) {
System.out.println("Before task");
Object result = proxy.invokeSuper(obj, args);
System.out.println("After task");
return result;
} else {
return proxy.invokeSuper(obj, args); // 不增强其他方法
}
}
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(MyService.class);
enhancer.setCallback(new MyServiceInterceptor());
MyService myService = (MyService) enhancer.create();
myService.performTask();
myService.otherTask();
}
}
4. 运行并测试
运行以上代码,你将看到以下输出:
Before task
Performing task...
After task
Performing other task...
解释
- 目标类:
MyService
包含两个方法performTask
和otherTask
。 - 代理类:
MyServiceInterceptor
实现了MethodInterceptor
接口,并重写intercept
方法。在intercept
方法中,我们检查被调用的方法名,如果是performTask
,则在调用前后插入自定义逻辑(即 “Before task” 和 “After task” 的输出)。 - 创建代理对象:使用
Enhancer
创建MyService
的代理对象,并设置MyServiceInterceptor
作为回调。 - 方法调用:调用代理对象的
performTask
和otherTask
方法,只有performTask
方法被增强,otherTask
方法保持原样。
通过这种方式,你可以使用 CGLIB 对某个对象的特定方法进行代理和增强。