博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Cglib代理
阅读量:5335 次
发布时间:2019-06-15

本文共 3191 字,大约阅读时间需要 10 分钟。

目标对象:package com.bj.daili;public class UserServiceImpl {    public final void saveUser(String username, String password) {        System.out.println("保存用户【"+username+"】,密码是【"+password+"】");    }    public void updateUser(String username, String password) {        System.out.println("更新用户【"+username+"】,密码是【"+password+"】");    }    public void deleteUser(String username) {        System.out.println("删除用户【"+username+"】");    }    public String findUser() {        System.out.println("查询用户,返回王老五");        return "王老五";    }    }代理对象:package com.bj.daili;import java.lang.reflect.Method;import org.springframework.cglib.core.Signature;import org.springframework.cglib.proxy.Enhancer;import org.springframework.cglib.proxy.MethodInterceptor;import org.springframework.cglib.proxy.MethodProxy;public class CglibProxy implements MethodInterceptor {        //定义一个目标对象    Object targetObject;    public Object createProxyObject(Object targetObject) {        this.targetObject = targetObject;        //如何根据目标对象创建的cglib的代理对象呢?                Enhancer enhancer = new Enhancer();        enhancer.setClassLoader(this.targetObject.getClass().getClassLoader());        enhancer.setSuperclass(this.targetObject.getClass());        enhancer.setCallback(this);        //创建cglib代理        return enhancer.create();    }        /**     * intercept:在访问目标对象之前先执行代理对象     *   * Object proxy:代理对象     *   * Method method:代理对象中执行的方法(目标的对象的方法对象)     *   * Object[] args:方法中的参数     *   * MethodProxy:方法的代理对象     *   * 返回值Ojbect:可以指定目标对象方法的放回值     * */    @Override    public Object intercept(Object proxy, Method method, Object[] args,MethodProxy methodProxy) throws Throwable {        if(method.getName()!=null && method.getName().contains("save") || method.getName().contains("update")){            security();//执行校验            System.out.println("代理对象的类:"+proxy.getClass());            System.out.println("代理对象或目标对象的方法名称:"+method.getName());            if(args!=null && args.length>0){                for(Object o:args){                    System.out.println("调用目标对象的方法参数:"+o);                }            }        }        //获取目标对象方法信息        Signature signature = methodProxy.getSignature();        System.out.println(signature.getName()+"   "+signature.getArgumentTypes()+"   "+signature.getReturnType());        /**         * method.invoke:调用目标对象         * 参数一:目标对象         * 参数二:调用目标对象的方法参数         * 返回Object:调用目标对象的方法的返回值         */        Object o = method.invoke(targetObject, args);        //如果返回null,客户端调用目标对象之后就都为null        return o;    }        //校验    public void security(){        System.out.println("开始执行校验...。校验结束");    }    }  测试:package com.bj.daili;public class App {    public static void main(String[] args) {        CglibProxy cglibProxy = new CglibProxy();        //使用createProxyObject的方法,传递目标对象,返回代理对象        UserServiceImpl userService = (UserServiceImpl) cglibProxy.createProxyObject(new UserServiceImpl());            userService.saveUser("李小四", "123");        userService.updateUser("李小四", "123");        userService.deleteUser("李小四");        String value = userService.findUser();        System.out.println("value:"+value);    }}

 

转载于:https://www.cnblogs.com/baijin05/p/5054171.html

你可能感兴趣的文章
Spring:源码解读Spring IOC原理
查看>>
如何将git既添加GitHub的远程仓库,又添加码云的远程仓库
查看>>
Linux上安装python3
查看>>
Event StoryLine Corpus 论文阅读
查看>>
Causal Corpus 事件因果关系语料统计
查看>>
从 relu 的多种实现来看 torch.nn 与 torch.nn.functional 的区别与联系
查看>>
AtCoder Beginner Contest 132 F Small Products
查看>>
洛谷 P2147 [SDOI2008]洞穴勘测
查看>>
算法笔记--可撤销并查集 && 可持久化并查集
查看>>
51Nod 1187 寻找分数
查看>>
BZOJ 4025: 二分图
查看>>
算法笔记--支配树
查看>>
Codeforces 1206 D - Shortest Cycle
查看>>
BZOJ 2125: 最短路
查看>>
BZOJ 4316: 小C的独立集
查看>>
BZOJ 3720: Gty的妹子树
查看>>
BZOJ 1023: [SHOI2008]cactus仙人掌图
查看>>
BZOJ 5125: [Lydsy1712月赛]小Q的书架
查看>>
算法笔记--圆方树
查看>>
Codeforces 750 E New Year and Old Subsequence
查看>>