java动态代理

本文介绍了Java动态代理的概念及其两种主要实现方式:JDK动态代理和CGLIB动态代理。JDK动态代理通过接口实现,适用于实现了接口的类;CGLIB则通过继承的方式实现动态代理,适用于没有实现接口的类。文章详细讲解了两种动态代理的创建过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring的AOP,Struts2的拦截器,都是java动态代理实现的例子。

一、前言

定义

按照代理的创建时期,代理类可以分为两种。

  • 静态代理
    由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件已经存在。
  • 动态代理
    在程序运行时,运用反射机制动态创建而成。

动态代理分类

代理类型实现方式效率特点应用前提
jdk动态代理java反射机制在生成类的过程中高效目标类基于统一的接口
cglib动态代理asm在生成类之后的相关执行过程比较高效

关于ASM
ASM是一个java字节码操控框架。

  • 能以二进制的形式修改已有类或动态生成类
  • 直接产生二进制class文件
  • 可以在类被加载入虚拟机之前动态改变类行为
  • -

使用动态代理要先了解的类和接口

  1. Proxy 类
方法用法
static InvocationHandler getInvocationHandler(Object proxy)获取指定代理对象所关联的调用处理器
static Class getProxyClass(ClassLoader loader, Class[] interfaces)获取关联于指定类装载器和一组接口的动态代理类的类对象
static boolean isProxyClass(Class cl)判断指定类对象是否是一个动态代理类
static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)为指定类装载器、一组接口及调用处理器生成动态代理类实例

2. InvocationHandler接口

Object invoke(Object proxy, Method method, Object[] args)

集中处理动态代理类上的所有方法调用。
第一个参数既是代理类实例,第二个参数是被调用的方法对象,第三个方法是调用参数。
调用处理器根据这三个参数进行预处理或分派到委托类实例上发射执行。

二、jdk动态代理

jdk通过 java.lang.reflect.Proxy 包来实现动态代理,创建机制是通过接口

当RealObject创建一个对象时,jdk会进行一下步骤:

  1. 获取RealObject上的所有接口
  2. 确定要生成的代理类的类名Proxy
  3. 确定要实现的接口信息,在程序运行时动态创建该代理类Proxy的字节码
  4. 根据字节码转化为对应的class对象
  5. 创建InvocationHandler的实例handler,用来处理Proxy所有方法调用
  6. Proxy的class对象以创建的handler对象为参数,实例化一个Proxy对象

jdk的动态代理中,某个类必须有实现的接口,而生成的代理类也只能代理该类接口定义的方法。如果该类没有实现接口,那么这个类就不能同JDK产生动态代理了。

三、cglib动态代理

cglib实现动态代理的过程:

  1. 查找类上所有非final的public类型的方法定义
  2. 将这些方法的定义转化成字节码
  3. 将组成的字节码转换成class对象
  4. 实现MethodInterceptor接口,用来处理对代理类上所有方法的请求
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值