java 动态代理

java 动态代理

代理

java中的代理分为 动态代理静态代理

这里的"代理",可以理解为歌手的经纪人。当你的公司开年会,你想请某个明星来唱歌,你需要去找这个明星的经纪人,由这个经纪人负责安排前期事宜,让明星来唱歌,以及处理后期事宜。

就是由你直接找明星来唱歌,变成你找明星的经纪人,经纪人除了可以让明星来唱歌,还负责了大大小小的事宜。

或者可以这样理解,一个对象是一个宝宝,一个代理对象就是一个打了各种预防针的强化宝宝😂

Spring 中的 AOP机制 就使用到了动态代理。

这里会补充动态代理和静态代理的区别...

动态代理代码实现

java.lang.reflect.Proxy 类提供了为对象生成代理对象的 静态方法

java 复制代码
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
  • 参数一指定类加载器,可以是任意一个类加载器,一般创建代理对象的方法创建在一个工具包中,这个工具包通常取名为 ProxyUtil,那么类加载器就使用 ProxyUtil.class.getClassLoader( )
  • 参数二为被代理对象实现的接口数组,假设object为被代理的对象,那么被代理对象实现的接口为 object.getClass( ).getInterfaces( )

返回数组

  • 参数三用于指定代理对象要干的事情,InvocationHandler 为接口,通过匿名内部类实现接口的invoke方法,在invoke方法里面编写业务逻辑代码。

    java 复制代码
    // InvocationHandler匿名内部类实现
    new InvocationHandler(){
        @Override
        public Object invoke(Object proxy, Method method, Object[] args){
            // 业务逻辑一
            
            Object result = method.invoke(object, args); //object为被代理的对象
            // 业务逻辑二
            return result;
        }
    }
通用代码(创建代理对象的工具类)
java 复制代码
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyUtil {
    public static <T> T createProxy(T obj) {

        T proxy = (T) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(),
                obj.getClass().getInterfaces(), new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        Object invoke = method.invoke(obj, args);
                        return invoke;
                    }
                });
        return proxy;
    }
}
相关推荐
憧憬成为java架构高手的小白6 分钟前
黑马八股--spring框架学习
java·学习·spring
唐青枫32 分钟前
Java Picocli 实战详解:用注解写出好用的命令行工具
java
2zcode33 分钟前
项目文档:基于MATLAB神经网络的心力衰竭预测与临床辅助决策系统研究
开发语言·神经网络·matlab·心力衰竭预测\
X-⃢_⃢-X1 小时前
四、OpenFeign远程调用
java·微服务·springboot·springcloud
减瓦1 小时前
深入 Quarkus:云原生时代 Java 的重生之路
java·开发语言·云原生
杨运交1 小时前
[053][核心模块]Java枚举缓存与ORM集成实践
java·开发语言·缓存
繁星蓝雨1 小时前
C++设计原理——异常处理
java·c++·异常处理·noexcept·throw·try catch
BerrySen1782 小时前
一个Java项目改成AI流程后,最难的部分完全变了
java·大数据·人工智能·可观测性·大模型应用开发·工程思维
2401_894915532 小时前
Geo优化系统源码部署搭建技术——PHP程序开发部署指南
开发语言·php
wuyk5552 小时前
67.嵌入式C语言进阶:结构体指针实战指南——STM32外设、传感器数据访问的高效技巧
c语言·开发语言·stm32·单片机