首页 > 其他分享 >入门jdk动态代理

入门jdk动态代理

时间:2024-06-16 09:59:50浏览次数:20  
标签:入门 invoke money Object 代理 jdk 方法 Method

前提知识点:

1、反射,Method类,表示方法。类中的方法,通过Method可以执行某个方法。
反射机制反射机制

2、jdk动态代理的实现
反射包 java.lang.reflect ,里面有三个类:InvocationHandler,Method,Proxy。
1)InvocationHandler 接口 (调用处理器):就一个方法invoke()

invoke() 调用 : 表示

方法原型:
参数:Object proxy :jdk创建的代理对象,无需赋值。
Method method : 目标类中的方法,jdk提供Method
Object[] args : 目标类中方法的参数,jdk提供

public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable;

怎么用:1.创建类实现的接口 InvocationHandler (这个接口表示你的代理要干什么)
2.重写 invoke方法,把原来静态代理中代理类要完成的功能,写在这里。

2)Method 类:表示方法的,目标类中的方法
作用:通过Method执行某个目标类的方法,method.invoke();
说明: method.invoke() 就是用来执行目标方法的,等同于静态代理中的

3)Proxy类:核心的对象,创建代理对象。

举个例子:

package com.money.provider;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * Author:     money
 * Description:  TODO
 * Date:    2024/6/15 22:07
 * Version:    1.0
 */

public class ServiceProxy implements InvocationHandler {

    private Object object;

    public ServiceProxy(Object o){
        object = o;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("进入代理对象类");
//        调用这个代理对象的方法的时候走这里
        Object invoke = method.invoke(object, args);
        System.out.println(invoke);
        return invoke;
//        return null;
    }
}

package com.money.provider;

import com.money.common.domain.User;
import com.money.common.service.UserService;

import java.lang.reflect.Proxy;

/**
 * Author:     money
 * Description:  TODO
 * Date:    2024/6/15 22:09
 * Version:    1.0
 */

public class Test {
    public static void main(String[] args) {
        UserService userService = new UserServiceImpl();

        UserService o = (UserService)Proxy.newProxyInstance(UserService.class.getClassLoader(),
                new Class[]{UserService.class},
                new ServiceProxy(userService)
        );
        System.out.println(o.getClass().getName());
        User user = new User();
        user.setName("money555");
        User user1 = o.getUser(user);
        System.out.println(user1.getName());
        System.out.println("结束");

    }
}

当程序调用o.getUser(user);时,底层是代理对象执行 ServiceProxy 中的 invoke 方法,并且会把调用的方法和方法参数传给 invoke方法,后者的 method.invoke(object,args) 是利用反射机制调用object的方法,参数是args,此操作返回值是操作对象方法的返回值。
最后的执行结果是:

jdk.proxy1.$Proxy0
进入代理对象类
用户名:money555
com.money.common.domain.User@50134894
money555
结束

生成的代理对象类是 jdk.proxy1.$Proxy0,代理调用getUser的时候就会进入到 ServiceProxy 的invoke方法之中。

这是简单的动态代理使用方法,底层逻辑后续会增出。

标签:入门,invoke,money,Object,代理,jdk,方法,Method
From: https://blog.csdn.net/m0_56017200/article/details/139712719

相关文章

  • python入门级经典交互式小程序
    今天学习做一个简单的交互式小程序知识点:1.对空列表进行添加元素,并分别打印每次添加的元素2.给while设置参数法进行循环3.for循环结合range()进行循环代码如下:klist=[]name=input("请输入你喜欢的明星:")while(name):  klist.append(name)  name=input......
  • 数据库MySQL——从0到1入门教程
    Q:为什么需要MySQL?A:网络服务中,我们需要存储、管理大量的数据,并确保数据的安全、实现增删改查操作的高效,因此需要一个系统用来专门管理数据,以实现上述的高性能要求,数据库管理系统应需而生八股如下:数据持久性:数据库能够持久化存储数据,确保数据在系统关闭或崩溃后依然存在......
  • 代理IP纯净度如何测试?
    在网络应用和数据采集等领域,代理IP被广泛使用,而代理IP的纯净度则直接影响其性能和可用性。代理IP的纯净度主要涉及到代理IP在网络传输过程中的稳定性、匿名性和安全性。今天就带大家一起了解代理IP纯净度对用户的重要性。第一,保护用户的隐私在网络世界中,用户的真实身份和位置......
  • 代理IP纯净度如何测试?
    在网络应用和数据采集等领域,代理IP被广泛使用,而代理IP的纯净度则直接影响其性能和可用性。代理IP的纯净度主要涉及到代理IP在网络传输过程中的稳定性、匿名性和安全性。今天就带大家一起了解代理IP纯净度对用户的重要性。第一,保护用户的隐私在网络世界中,用户的真实身份和位置......
  • 推荐 | 入门书籍《生物信息学》(第四版),含PDF和PPT
    《生物信息学》联合国内高校学者,紧密跟踪学科发展,提炼学科精华,编写完成。全书涵盖了生物信息学、系统生物学、合成生物学的相关内容,以及应用于第二代测序技术的相关软件和算法。第一、二、三版出版以来,越来越多的高校将其作为首选专业教材或选修教材。作为科学出版社普通高等教育......
  • kettle从入门到精通 第七十课 ETL之kettle kettle数据校验,脏数据清洗轻松拿捏
    场景:输入在指定的错误(错误应涵盖数据类型不匹配的情况)行数内,trans不报错,但通过错误处理步骤捕捉,并记入文件,整个数据管线正常完成直至处理完最后一个输入行。解决方案:使用步骤【数据检验】进行处理。这个步骤和常规的业务系统对接三方接口一个逻辑,将符合规则的数据放行,不符合的......
  • 机器视觉入门学习:YOLOV5自定义数据集部署、网络详解、损失函数(学习笔记)
     前言源码学习资源:YOLOV5预处理和后处理,源码详细分析-CSDN博客网络学习资源:YOLOv5网络详解_yolov5网络结构详解-CSDN博客YOLOv5-v6.0学习笔记_yolov5的置信度损失公式-CSDN博客 本文为个人学习,整合各路大佬的资料进行V5-6.0版本的网络分析,在开始学习之前最好先去学习YOL......
  • GDB:从零开始入门GDB
    目录        1.前言        2.开启项目报错        3.GDB的进入和退出        4.GDB调试中查看代码和切换文件        5.GDB调试中程序的启动和main函数传参        6.GDB中断点相关的操作        7.GDB中的调......
  • Python学习笔记8:入门知识(八)
    前言本篇是元组的知识点学习以及知识点的补充元组概念不可变的列表,叫做元组。在之前列表的特性中,我们就说过列表是可变的,但是在实际使用过程中,我们有时候仍然需要一系列不可变的元素,这个时候就需要元组出场了。定义元组看起来犹如列表,但使用圆括号而不是方括号来标识......
  • 【NOI】C++程序结构入门之循环结构三——break、continue
    文章目录前言一、循环的流程控制1.1导入1.2循环的打破与跳过1.2.1break打破1.2.2continue跳过1.2.3总结二、例题讲解问题:1468.小鱼的航程问题:1074-小青蛙回来了问题:1261.韩信点兵问题:1254.求车速问题:1265.爱因斯坦的数学题三、总结四、感谢前言循环......