博客
关于我
Java动态代理的实现方式
阅读量:792 次
发布时间:2023-01-28

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

Java动态代理的实现方式

什么是动态代理?

动态代理是一种编程模式,允许在运行时创建代理对象,以实现对目标对象的方法进行增强。代理对象与目标对象具有相同的接口,但在执行特定逻辑时嵌入增强功能或 调用其他对象的方法。动态代理通过动态生成代理对象的方式,为目标对象添加功能,如日志记录、事务管理等,减少代码耦合,降低代码重复率。

动态代理的作用

动态代理适用于在不侵入目标类逻辑的前提下,添加公共功能。例如:

  • 记录日志记录:跟踪对象方法的调用情况。
  • 管理事务:确保方法执行的原子性和持久性。
  • 监控性能:统计方法执行时间。

这种方法能在不修改目标对象代码的前提下,降低代码耦合度,减少重复代码。

动态代理的使用场景

动态代理广泛应用于:

  • Spring AOP:通过动态代理实现方法级别的切割,如事务管理、日志记录等。
  • 手动创建代理:针对特定场景,按需动态生成代理对象。

动态代理的实现技术

1. JDK动态代理技术(基于接口)
  • 适用条件:目标类必须有接口。
  • 实现方式:通过Proxy.newProxyInstance方法创建代理对象。开源框架如Spring AOP默认使用该技术。
2. Cglib动态代理技术(基于子类)
  • 适用条件:目标类没有接口且不能被final修饰。
  • 实现方式:通过生成目标类的动态子类实现。Spring AOP可通过配置强制使用此技术。

动态代理实现对比

特性 JDK动态代理技术 Cglib动态代理技术
目标类要求 有接口 无接口,不能有final修饰
生成方式 基于接口动态实现类 基于目标类生成动态子类
优点 非侵入性,代码独立性强 适用于不能实现接口或切断 inheritance
缺点 需要接口接口分离 難以处理 final 方法,不能链式调用

手动创建JDK动态代理

public interface JDKService {    void show(String s);}public class JDKServiceImpl implements JDKService {    @Override    public void show(String s) {        System.out.println("JDKService show......" + s);    }}public class JDKProxyDemo {    public static void main(String[] args) {        JDKService jdkService = new JDKServiceImpl();        Object proxyInstance = Proxy.newProxyInstance(            jdkService.getClass().getClassLoader(),            jdkService.getClass().getInterfaces(),            (proxy, method, args) -> {                System.out.println("Method: " + method.getName());                System.out.println("Args: " + Arrays.toString(args));                Object result = method.invoke(jdkService, args);                System.out.println("Result: " + result);                return result;            }        );        JDKService proxy = (JDKService) proxyInstance;        proxy.show("hello");    }}

Cglib动态代理手动创建

public class Target {    public void show(String s) {        System.out.println("Target show.......... " + s);    }}public class Advice {    public void before() {        System.out.println("Advice before ......");    }    public void after() {        System.out.println("Advice after .......");    }}public class CglibProxyDemo {    public static void main(String[] args) {        Target target = new Target();        Advice advice = new Advice();        // 动态增强器        Enhancer enhancer = new Enhancer();        enhancer.setSuperclass(Target.class); // 设置被代理类        // 回调增强        enhancer.setCallback((MethodInterceptor o, Method method, Object objects, MethodProxy methodProxy) -> {            advice.before();            Object result = method.invoke(target, objects);            advice.after();            return result;        });        Target proxy = (Target) enhancer.create();        proxy.show("hello");    }}

到这里,文章完成,涵盖了动态代理的实现方式,包括两种技术的特点及典型实现示例。文章结构清晰,便于阅读和理解。

转载地址:http://ynryk.baihongyu.com/

你可能感兴趣的文章
2025版最新0基础怎么转行网络安全?零基础入门到精通,收藏这篇就够了
查看>>
2025版最新Bash Shell入门指南,零基础入门到精通,收藏这篇就够了
查看>>
2025版最新C++快速入门(适合小白)零基础入门到精通,收藏这篇就够了
查看>>
2025版最新CTF选手必藏的50个实战解题思路,零基础入门到精通,收藏这篇就够了
查看>>
2025版最新Java教程(非常详细)零基础入门到精通,收藏这篇就够了
查看>>
2025版最新Kali Linux渗透测试教程(全面详细)零基础入门到精通,收藏这篇就够了
查看>>
2025版最新LangChain框架快速入门,零基础入门到精通,收藏这篇就够了
查看>>
2025版最新Metasploit安装使用教程(非常详细)零基础入门到精通,收藏这一篇就够了
查看>>
2025版最新Nessus 工具介绍与使用教程,零基础入门到精通,收藏这一篇就够了
查看>>
2025版最新wireshark怎么抓包?Wireshark入门指南,零基础入门到精通,收藏这篇就够了
查看>>
2025版最新一文彻底搞懂大模型 - Agent(非常详细)零基础入门到精通,收藏这篇就够了
查看>>
2025版最新关于HW护网行动的一些知识,零基础入门到精通,收藏这篇就够了
查看>>
(建议收藏)2024最新 URL Scheme大全APP跳转界面地址更新中 ios快捷指令快捷方式链接跳转微信小程序必备autojs可用免root (可定制开发和提取URL Scheme 参数提取)
查看>>
2025版最新大模型学习路线,零基础入门到精通,收藏这篇就够了
查看>>
2025版最新大模型开发流程(非常详细)零基础入门到精通,收藏这一篇就够了
查看>>
(干货)数据分析案例--以上海二手房为例
查看>>
(大部分安卓手机通用)一加OnePlus Ace3扬声器优化教程 外放直接媲美苹果
查看>>
2025版最新大模型微调方法(非常详细)零基础入门到精通,收藏这篇就够了
查看>>
2025版最新大模型算法岗位薪资指南,零基础入门到精通,收藏这一篇就够了
查看>>
2025版最新大语言模型的指令微调,零基础入门到精通,收藏这篇就够了
查看>>