# proxy-utils **Repository Path**: byx2000/proxy-utils ## Basic Information - **Project Name**: proxy-utils - **Description**: Java动态代理工具类 - **Primary Language**: Java - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-03-17 - **Last Updated**: 2023-05-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ProxyUtils——Java动态代理工具类 ProxyUtils是一个动态代理工具类,基于JDK动态代理和CGLIB动态代理,并对这两种动态代理API进行了封装,让使用更方便。 ProxyUtils提供以下功能特性: * 灵活的方法拦截器配置 * 灵活的方法匹配器配置 * 丰富的预定义方法拦截器和方法匹配器 * 动态创建接口实现类 * 动态创建子类 * 根据目标对象自动选择代理类型(JDK或CGLIB) ## 在项目中引入ProxyUtils 1. 添加maven仓库地址 ```xml byx-maven-repo byx-maven-repo https://gitee.com/byx2000/maven-repo/raw/master/ ``` 2. 添加maven依赖 ```xml byx.util ProxyUtils 1.0.0 ``` ## API文档 [API文档](http://byx2000.gitee.io/javadoc/ByxAOP-1.0.0-javadoc/) ## 使用示例 通过一个简单例子来快速了解ProxyUtils。 `UserDao`接口: ```java public interface UserDao { int listAll(); int listById(int id); void deleteByName(String name); } ``` `UserDaoImpl`实现类: ```java public class UserDaoImpl implements UserDao { @Override public int listAll() { System.out.println("正在执行listAll方法"); return 123; } @Override public int listById(int id) { System.out.println("正在执行listById方法:id = " + id); return 456; } @Override public void deleteByName(String name) { System.out.println("正在执行deleteByName方法:name = " + name); } } ``` 主函数: ```java import byx.util.proxy.ProxyUtils; import byx.util.proxy.core.MethodInterceptor; import byx.util.proxy.core.MethodMatcher; import java.util.Arrays; import static byx.util.proxy.core.MethodMatcher.*; public class Main { public static void main(String[] args) { // 定义方法拦截器 MethodInterceptor interceptor = targetMethod -> { MethodSignature signature = targetMethod.getSignature(); Object[] params = targetMethod.getArgs(); System.out.println("开始拦截" + signature.getName() + "方法"); System.out.println("原始参数:" + Arrays.toString(params)); Object ret = targetMethod.invoke(params); System.out.println("原始返回值:" + ret); System.out.println("结束拦截" + signature.getName() + "方法"); return ret; }; // 定义方法匹配器:匹配所有方法名以list开头且返回值为int类型的方法 MethodMatcher matcher = withPattern("list(.*)").andReturnType(int.class); // 创建AOP代理对象 UserDao userDao = ProxyUtils.proxy(new UserDaoImpl(), interceptor.when(matcher)); userDao.listAll(); System.out.println(); userDao.listById(1001); System.out.println(); userDao.deleteByName("XiaoMing"); } } ``` ### 输出结果 ``` 开始拦截listAll方法 原始参数:null 正在执行listAll方法 原始返回值:123 结束拦截listAll方法 开始拦截listById方法 原始参数:[1001] 正在执行listById方法:id = 1001 原始返回值:456 结束拦截listById方法 正在执行deleteByName方法:name = XiaoMing ``` 从输出结果可以看到,`UserDaoImpl`中的`listAll`方法和`listById`方法都被增强了,而`deleteByName`方法没有被增强。 ## 更多使用示例 * [参数校验](./doc/参数校验.md) * [声明式事务管理](./doc/声明式事务管理.md) * [动态实现接口](./doc/动态实现接口.md) * [批量实现接口方法](./doc/批量实现接口方法.md) * [优雅地创建适配器](./doc/优雅地创建适配器.md)