• 【Java】关于动态代理的基础知识个人笔记


    目录

    动态代理概念

    Proxy类

    InvocationHandler接口

    示例代码


    动态代理概念

    谈论Java动态代理时,要首先明确它是一种在运行时创建代理对象的技术。通过动态代理,我们可以在不预先知道具体类的情况下,通过创建一个代理类来实现对目标对象的代理访问和控制(Java标准库提供了动态代理功能,允许在运行期动态创建一个接口的实例)

    动态代理主要依赖于两个核心组件:Proxy类和InvocationHandler接口

    Proxy类

    该类提供了创建动态代理对象的静态方法。我们可以使用这些方法来创建代理对象,并指定代理对象的类加载器、实现的接口以及InvocationHandler对象(三大要素)。

    Proxy.newProxyInstance接收的三个参数:
    loader : 一个 ClassLoader 对象,定义了代理类的 ClassLoder

    interfaces: 一个 Interface 对象的数组,定义代理类实现的接口列表

    handler:一个 InvocationHandler 对象,表示当动态代理对象在调用方法时,会关联到哪一个 InvocationHandler 对象上


    InvocationHandler接口

    该接口中只有一个方法invoke,在代理对象调用方法时会被触发。invoke方法接受三个参数:代理对象、调用的方法以及方法的参数。在invoke方法中,我们可以添加自定义的逻辑,在方法调用前后执行相应的操作。

    InvocationHandler 的 invoke方法接收三个参数

    proxy:代理后的实例对象

    method:对象被调用的方法

    args:调用方法时候的参数

    示例代码

    1. import java.lang.reflect.InvocationHandler;
    2. import java.lang.reflect.Method;
    3. import java.lang.reflect.Proxy;
    4. interface BusinessInterface {
    5. void doSomething();
    6. }
    7. class RealBusiness implements BusinessInterface {
    8. @Override
    9. public void doSomething() {
    10. System.out.println("Real business logic is executed.");
    11. }
    12. }
    13. class CustomInvocationHandler implements InvocationHandler {
    14. private Object target;
    15. public CustomInvocationHandler(Object target) {
    16. this.target = target;
    17. }
    18. @Override
    19. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    20. System.out.println("Before executing method " + method.getName());
    21. Object result = method.invoke(target, args);
    22. System.out.println("After executing method " + method.getName());
    23. return result;
    24. }
    25. }
    26. public class DynamicProxyExample {
    27. public static void main(String[] args) {
    28. BusinessInterface realObject = new RealBusiness();
    29. CustomInvocationHandler handler = new CustomInvocationHandler(realObject);
    30. BusinessInterface proxyObject = (BusinessInterface) Proxy.newProxyInstance(
    31. realObject.getClass().getClassLoader(),
    32. realObject.getClass().getInterfaces(),
    33. handler);
    34. proxyObject.doSomething();
    35. }
    36. }
  • 相关阅读:
    一文搞清各种来源的wmts服务加载,告别ctrl+c,v
    SpringBoot:容器中添加视图解析器
    复制带随机指针的链表
    JavaScript之数据类型、类型判断、类型转换
    21. 合并两个有序链表
    关于Vue中npm install出现报错及解决方法
    LAMP平台的搭建
    计算机毕业设计之java+springcloud基于vue的智慧养老平台-老人信息管理-敬老院管理系统
    javascript基础
    小红书内测「群AI」功能;大模型技术图谱;曾鸣「看十年」智能商业演讲实录;GPT最佳实践-大白话编译版 | ShowMeAI日报
  • 原文地址:https://blog.csdn.net/uuzeray/article/details/136327493