当前位置:网站首页>Cglib代理-代码增强测试
Cglib代理-代码增强测试
2022-07-02 06:09:00 【一眉程序猿】
导包
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
编写方法拦截器
- 方法增强具体逻辑
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.util.Arrays;
/** * 自定义 cglib 代理 * * @author Ara * @since 2022/6/20 */
public class MyCglibProxyMethodInterceptor<T> implements MethodInterceptor {
/** * 目标对象 */
private final T target;
/** * 构造方法 */
public MyCglibProxyMethodInterceptor(T target) {
this.target = target;
}
/** * 获取代理对象 */
public T getProxyObject(){
Enhancer enhancer = new Enhancer();
//设置父类 因为cglib是针对指定的类生成一个子类用于其增强行为
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(this);
return (T) enhancer.create();
}
// TODO 执行增强部分
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("执行前 方法参数: " + Arrays.toString(objects));
Object result = method.invoke(target, objects);
System.out.println("执行后 返回值: " + result);
return result;
}
}
编写待增强测试类
- 增强目标点
/** * 文章 Service * * @author Ara * @since 2022/6/20 */
public class ArticleService {
public String saveArticle(String article) {
System.out.printf("保存文章[%s]...%n", article);
return article;
}
}
编写测试
- 检验是否能够进行增强
public class MainTest {
public static void main(String[] args) {
ArticleService articleService = new ArticleService();
//声明Cglib方法拦截增强实现类
MyCglibProxyMethodInterceptor<ArticleService> cglibProxyMethodInterceptor = new MyCglibProxyMethodInterceptor<>(articleService);
// 获取代理类
ArticleService articleServiceProxy = cglibProxyMethodInterceptor.getProxyObject();
//使用代理类调用方法
articleServiceProxy.saveArticle("Java");
}
}
验证结果

小总结
简单对比cglib与JDK动态代理:
- 这里使用cglib进行代理时,不论其目标类是否实现了接口,都可以对其进行增强。
- 但是单独使用JDK动态代理,就只能增强实现了接口的类重写的方法。
以下是对cglib和JDK动态代理是否能够增强有无接口实现的类的对比代码,感兴趣的读者可以进行测试:
public class MainTest {
public static void main(String[] args) {
cglibProxyNoInterfaceTest();
}
/** * cglib代理(代理目标类未实现接口) */
private static void cglibProxyNoInterfaceTest(){
ArticleService articleService = new ArticleService();
//声明Cglib方法拦截增强实现类
MyCglibProxyMethodInterceptor<ArticleService> cglibProxyMethodInterceptor = new MyCglibProxyMethodInterceptor<>(articleService);
// 获取代理类
ArticleService articleServiceProxy = cglibProxyMethodInterceptor.getProxyObject();
//使用代理类调用方法
articleServiceProxy.saveArticle("Java");
}
/** * cglib代理(代理目标类实现了接口) */
private static void cglibProxyHasInterfaceTest(){
UserService userService = new UserServiceImpl();
//声明Cglib方法拦截增强实现类
MyCglibProxyMethodInterceptor<UserService> cglibProxyMethodInterceptor = new MyCglibProxyMethodInterceptor<>(userService);
// 获取代理类
UserService userServiceProxy = cglibProxyMethodInterceptor.getProxyObject();
//使用代理类调用方法
userServiceProxy.add("Ara");
}
/** * JDK动态代理(代理目标类实现了接口) */
private static void jdkDynamicProxyHasInterfaceTest(){
//原对象 (接口接收参数)
UserService userService = new UserServiceImpl();
//声明增强处理程序
MyJdkProxyInvocationHandler<UserService> proxyInvocationHandler = new MyJdkProxyInvocationHandler<>(userService);
//获取代理对象
UserService proxyUserService = proxyInvocationHandler.getProxyObject();
//使用代理对象来调用方法
proxyUserService.add("Ara");
}
/** * JDK动态代理(代理目标类未实现接口) * 有误,使用JDK动态代理实现增强,必须要求代理目标实现了接口 */
private static void jdkDynamicProxyNoInterfaceTest(){
ArticleService articleService = new ArticleService();
//声明增强处理程序
MyJdkProxyInvocationHandler<ArticleService> proxyInvocationHandler = new MyJdkProxyInvocationHandler<>(articleService);
//获取代理对象
ArticleService proxyArticleService = proxyInvocationHandler.getProxyObject();
//使用代理对象来调用方法
proxyArticleService.saveArticle("Java");
}
}
边栏推荐
- On Web server
- 深入学习JVM底层(四):类文件结构
- Web page user step-by-step operation guide plug-in driver js
- BGP 路由优选规则和通告原则
- 经典文献阅读之--Deformable DETR
- [C language] screening method for prime numbers
- LeetCode 83. Delete duplicate elements in the sorting linked list
- BGP报文详细解释
- Shenji Bailian 3.54-dichotomy of dyeing judgment
- LeetCode 83. 删除排序链表中的重复元素
猜你喜欢

ROS2----LifecycleNode生命周期节点总结

Detailed explanation of BGP message

深入学习JVM底层(五):类加载机制

AttributeError: ‘str‘ object has no attribute ‘decode‘

Unity shader learning notes (3) URP rendering pipeline shaded PBR shader template (ASE optimized version)

加密压缩文件解密技巧

Invalid operation: Load into table ‘sources_orderdata‘ failed. Check ‘stl_load_errors‘ system table

经典文献阅读之--SuMa++

数据回放伴侣Rviz+plotjuggler

Deep learning classification network -- vggnet
随机推荐
Linkage between esp8266 and stc8h8k single chip microcomputer - Weather Clock
keepalived安装使用与快速入门
LeetCode 90. Subset II
Contest3147 - game 38 of 2021 Freshmen's personal training match_ G: Flower bed
Pbootcms collection and warehousing tutorial quick collection release
深入学习JVM底层(五):类加载机制
使用HBuilderX的一些常用功能
Brain and cognitive neuroscience matlab psychoolbox cognitive science experimental design - experimental design 4
JWT tool class
ES6的详细注解
500. Keyboard line
WLAN相关知识点总结
Comment utiliser mitmproxy
Singleton mode compilation
LeetCode 83. Delete duplicate elements in the sorting linked list
Introduce uview into uni app
Detailed notes of ES6
On Web server
利用传统方法(N-gram,HMM等)、神经网络方法(CNN,LSTM等)和预训练方法(Bert等)的中文分词任务实现
Jetpack Compose 与 Material You 常见问题解答