java动态代理与cglib动态代理

这篇博客详细介绍了Java动态代理和Cglib动态代理的实现方式。通过示例展示了如何使用JDK动态代理创建代理对象,以及如何利用Cglib动态代理生成子类进行方法拦截。内容涵盖了代理模式的基本概念、代理类的创建过程以及代理逻辑的实现。
摘要由CSDN通过智能技术生成

java动态代理与cglib动态代理

public interface Subject  {

        String sayHelloWorld(String name,Subject subject);

        Subject sayBye();

         void haha();
}
public class RealSubject implements Subject{

        private String stest;

        public String getStest() {
                return stest;
        }

        public void setStest(String stest) {
                this.stest = stest;
        }

        @Override
        @NotNull
        public String sayHelloWorld(String name,Subject subject) {
                return "hello"+name;
        }

        @Override
        public Subject sayBye() {
                RealSubject subject= new RealSubject();
                subject.setStest("good job!");
                System.out.println("good Job!");
                return subject;
        }

        public void haha(){
                System.out.println("测试************");
        }
}
public class ProxyMain {
        public static void main(String[] args) {
                /**JDK动态代理:必须通过接口代理*/
                Subject subject = (Subject) jdkProxy();
                subject.sayBye();
                /**Cglib 动态代理:*/
                Subject subject1 = (Subject) cglibProxy();
                subject1.sayBye();
        }

        /**
         * JDK 动态代理:
         * 创建被代理对象
         * 获取被代理对象的接口类模版数组
         * 实现InvocationHandler的invoke 方法,执行代理逻辑
         * 通过Proxy.newProxyInstance 获取代理对象
         *
         * @return java.lang.Object
         * @Returns
         * @author 陈奎金
         * @date: 2022/2/8 14:41
         * @updateUser(修改人): user
         * @updateDate(修改时间): 2022/2/8 14:41
         * @updateRemark(修改备注): 说明本次修改内容
         **/
        public static Object jdkProxy() {
                /**创建被代理对象*/
                Subject subject = new RealSubject();
                /**获取被代理对象的接口末班数组*/
                Class[] interfaces = subject.getClass().getInterfaces();
                return Proxy.newProxyInstance(subject.getClass().getClassLoader(), interfaces, (proxy, method, args) -> {
                        System.out.println("调用之前");
                        System.out.println(method.getName());
                        switch (method.getName()) {
                                case "SayHelloWorld":
                                        return "" + method.invoke(subject, args);
                                case "sayBye":
                                        Object object = method.invoke(subject, args);
                                        return object;
                                case "haha":
                                        return null;
                                default:
                                        return new Object();
                        }
                });
        }

        /**
         * cglib. 动态代理
         * 创建被代理对象
         * 窗增强器->设置父类->设置回调-->回调对象虚实现MethodInterceptor接口中intercept 方法-->创建代理对象
         *
         * @return 代理对象
         * @Returns
         * @author 陈奎金
         * @date: 2022/2/8 14:36
         * @updateUser(修改人): user
         * @updateDate(修改时间): 2022/2/8 14:36
         * @updateRemark(修改备注): 说明本次修改内容
         **/
        public static Object cglibProxy() {
                /**创建被代理对象*/
                Subject subject = new RealSubject();
                /**创建增强器,用来创建代理对象*/
                Enhancer enhancer = new Enhancer();
                /**设置父类,因为Cglib是针对指定的类生成一个子类,所以需要指定父类*/
                enhancer.setSuperclass(subject.getClass());
                /**创建代理逻辑*/
                MethodInterceptor methodInterceptor = (proxy, method, obj, methodProxy) -> {
                        System.out.println("调用之前");
                        System.out.println("Method" + method);
                        switch (method.getName()) {
                                case "sayHelloWorld":
                                        String string = (String) methodProxy.invoke(subject, obj);
                                        return "" + string;
                                case "sayBye":
                                        Object object = methodProxy.invoke(subject, obj);
                                        return object;
                                case "haha":
                                        return null;
                                default:
                                        return new Object();
                        }
                };
                /**设置回调:将代理逻辑设置到回调中*/
                enhancer.setCallback(methodInterceptor);
                /**创建代理对象,并将代理对象返回*/
                return enhancer.create();
        }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值