Spring6 代理模式-动态代理

需求:

生产代理对象的工厂类:

复制代码
package aop.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

public class ProxyFactory {

    //目标对象
    private Object target;

    public ProxyFactory(Object target) {
        this.target = target;
    }

    //返回代理对象
    public Object getProxy(){
        /*
        Proxy.newProxyInstance()三个参数
        classLoader类加载器:加载动态生成代理类的类加载器
        interface:目标对象实现的所有接口的class类型数组
        invocationHandler:设置代理对象实现目标对象方法的过程,即代理类中如何重写接口中的抽象方法
         */

        //ClassLoader
        ClassLoader classLoader = target.getClass().getClassLoader();
        //interface:目标对象实现的所有接口的class类型数组
        Class<?>[] interfaces = target.getClass().getInterfaces();
        //InvocationHandler
        InvocationHandler invocationHandler = new InvocationHandler(){

            /**
             * proxy:代理对象
             * method:代理对象需要实现的方法,即其中需要重写的方法
             * args:method所对应方法的参数
             */
            @Override
            public Object invoke(Object proxy,
                                 Method method,
                                 Object[] args) throws Throwable {

                System.out.println("[动态代理][日志] "+method.getName()+",参数:"+ Arrays.toString(args));
                //调用目标的方法
                Object result = method.invoke(target, args);
                System.out.println("[动态代理][日志] "+method.getName()+",结果:"+ result);
                return result;
            }
        };
        return Proxy.newProxyInstance(classLoader,interfaces,invocationHandler);
    }
}

Caculator.java 接口

复制代码
package aop.proxy;

public interface Caculator {
    int add(int i, int j);

    int sub(int i, int j);

    int mul(int i, int j);

    int div(int i, int j);
}

CaculatorImpl.java

复制代码
package aop.proxy;

public class CaculatorImpl implements Caculator {
    @Override
    public int add(int i, int j) {
        int result = i+j;
        System.out.println("方法内部:result:"+result);
        return result;

    }

    @Override
    public int sub(int i, int j) {
        return i-j;
    }

    @Override
    public int mul(int i, int j) {
        return i*j;
    }

    @Override
    public int div(int i, int j) {
        return i/j;
    }
}

.TestCal.java

复制代码
package aop.proxy;

public class TestCal {
    public static void main(String[] args) {
        //创建代理对象
        ProxyFactory proxyFactory = new ProxyFactory(new CaculatorImpl());
        Caculator proxy = (Caculator) proxyFactory.getProxy();
        proxy.add(1,2);
    }
}

输出

总结:

将日志功能集中到一个代理类中,将来有任何日志需求,都通过这一个代理类来实现。这就需要使用动态代理技术了。

相关推荐
AI人工智能+电脑小能手17 小时前
【大白话说Java面试题】【Java基础篇】第30题:JDK动态代理和CGLIB动态代理有什么区别
java·开发语言·后端·面试·代理模式
AI人工智能+电脑小能手2 天前
【大白话说Java面试题】【Java基础篇】第29题:静态代理和动态代理的区别是什么
java·开发语言·后端·面试·代理模式
qq_三哥啊4 天前
【mitmproxy】提取 OpenCode 的 API 接口
网络·代理模式
qq_三哥啊4 天前
【mitmproxy】通过 mitmproxy 的本地捕获代理模式获取 OpenCode 发起的 AI API 请求的详细信息
网络·系统安全·代理模式
fengfuyao9857 天前
MATLAB实现自适应动态规划(ADP)方法
matlab·动态规划·代理模式
geovindu10 天前
go: Proxy Pattern
开发语言·后端·设计模式·golang·代理模式
我爱cope13 天前
【从0开始学设计模式-12| 代理模式】
设计模式·代理模式
两年半的个人练习生^_^14 天前
每日一学:设计模式之代理模式
java·设计模式·代理模式
天若有情67315 天前
用动态规划思路,一步一步实现响应式数据(从本质到落地)
算法·动态规划·代理模式
希望永不加班16 天前
Spring AOP 代理模式:CGLIB 与 JDK 动态代理区别
java·开发语言·后端·spring·代理模式