JDK动态代理~Cglib动态代理,进行方法的增强
JDK动态代理(必须要有接口,代理类和被代理类实现相同的接口)
public class UserServiceJDKProxy {
public static UserService createUserServiceJDKProxy(final UserService userService) {
//ClassLoader loader : 被代理类对象的类加载器
//Class<?>[] interfaces : 被代理类对象所实现的所有接口
//InvocationHandler h : 执行方法增强的处理器
Object proxyInstance = Proxy.newProxyInstance(
userService.getClass().getClassLoader(),
userService.getClass().getInterfaces(),
// 目标方法增强
(proxy, method, args) -> {
//Object proxy : 代理类对象
// Method method : 被代理类的原方法
// Object[] args : 被代理类的原方法的实参
Object result = null;
if ("selectAll".equals(method.getName()) || "deleteUser".equals(method.getName())) {
//是selectAll方法和deleteUser方法才增强
//权限校验
System.out.println("权限校验");
//执行被代理类的目标方法
result = method.invoke(userService, args);
//日志记录
System.out.println("日志记录");
} else {
//不是addUser方法和deleteUser方法执行目标方法
result = method.invoke(userService, args);
}
return result;
}
);
return (UserService) proxyInstance;
}
}
Cglib动态代理(不限定是否具有接口,可以对任意操作进行增强.不需要原始被代理类对象,动态创建新的代理对象)
/**
* 获取代理类对象
*
* @param clazz 被代理类的字节码对象
* @return 返回代理类对象
*/
public static UserService createUserServiceCglibProxy2(Class clazz) {
// 创建cglib动态代理核心对象
Enhancer enhancer = new Enhancer();
// 设置被代理类是代理类的父类
enhancer.setSuperclass(clazz);
// 方法增强
enhancer.setCallback(new MethodInterceptor() {
/**
*
* @param proxy 代理类对象
* @param method 被代理类的目标方法
* @param args 被代理类的目标方法的实参
* @param methodProxy 代理类的方法
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
Object result = null;
// 判断哪些方法需要增强
if ("selectAll".equals(method.getName())) {
//权限校验
System.out.println("权限校验");
//执行被代理类的目标方法
result = methodProxy.invokeSuper(proxy, args);
//日志记录
System.out.println("日志记录");
} else {
//不是addUser和deleteUser执行目标方法
result = methodProxy.invokeSuper(proxy, args);
}
return result;
}
});
// 返回动态创建的代理对象
return (UserService) enhancer.create();
}
分类:
5、Spring
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理