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;
    }
}

image

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();
    }
posted @   我也有梦想呀  阅读(138)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示