首页 > 编程语言 >【代理】【二】代理源码解析-JDK动态代理使用及源码分析

【代理】【二】代理源码解析-JDK动态代理使用及源码分析

时间:2023-02-20 19:26:41浏览次数:40  
标签:JDK Object 代理 InvocationHandler Proxy 源码 proxy

1  前言

本节我们讲一下动态代理的实现过程,并且从源码分析下产生过程。看之前先简单看几个基础知识:

  • 函数接口BiFunction<T, U, R> : R apply(T t, U u); 就是参数是T、U返回一个结果R    比如: (s1, s2) -> s1.toString() + s2.toString();
  • 函数接口Supplier<T> : T get(); 就是参数空返回一个结果T                                         比如:() -> "1"
  • Map res = map.putIfAbsent(key, val)    当key存在,返回对应的值,当key不存在将键值对key->val放进集合,并返回val
  • ReferenceQueue 引用队列跟GC相关的一个队列

2  基础使用

JDK的动态代理中有两个主要的类是:InvocationHandler(接口)和Proxy(类):

  • InvocationHandler接口是proxy代理实例的调用处理程序实现的一个接口,每一个proxy代理实例都有一个关联的调用处理程序;在代理实例调用方法时,方法调用被编码分派到调用处理程序的invoke方法。
  • Proxy类就是用来创建一个代理对象的类,它提供了很多方法,比如newProxyInstance。

JDK动态代理步骤:

  1. 创建被代理的接口和类 也就是我们第一节里的UserService、UserServiceImpl;
  2. 创建InvocationHandler接口的实现类,在invoke方法中实现代理逻辑;
  3. 通过Proxy的静态方法newProxyInstance( ClassLoaderloader, Class[] interfaces, InvocationHandler h)创建一个代理对象;
  4. 使用代理对象,完成业务功能。

我们先从一个Demo入手,看一下JDK动态代理的基础用法:

public class MyInvocationHandler implements InvocationHandler {
   // 被代理的对象
    private Object target;

    public MyInvocationHandler(Object target) {
        this.target = target;
    }
    /**
     * proxy:  代理类代理的真实代理对象com.sun.proxy.$Proxy0
     * method: 我们所要调用某个对象真实的方法的Method对象
     * args:   指代代理对象方法传递的参数
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("我是前");
        Object res = method.invoke(target, args);
        System.out.println("我是后");
        return res;
    }
}
public class Client {
    public static void main(String[] args) {
        UserService userService = new UserServiceImpl();
        MyInvocationHandler myInvocationHandler = new MyInvocationHandler(userService);
        /*
         * newProxyInstance需要的三个参数
         * 类加载器、接口数组、InvocationHandler实现
         */
        UserService proxy = (UserService)Proxy.newProxyInstance(userService.getClass().getClassLoader(), userService.getClass().getInterfaces(), myInvocationHandler);
        proxy.addUser();
    }
}

JDK动态代理测试结果:

3  源码解析

通过基础使用,我们发现Proxy返回的代理对象确实对我们的方法进行了增强,那么我们就来看一下代理的创建过程,我们就从Proxy.newProxyInstance出发看起。

3.1  Proxy.newProxyInstance

 

标签:JDK,Object,代理,InvocationHandler,Proxy,源码,proxy
From: https://www.cnblogs.com/kukuxjx/p/17138172.html

相关文章

  • Windows打开代理快捷方式
    最近使用电脑需要频繁打开关闭网络代理(全局代理会导致一些网站打不开),在想有没有快捷方式,一搜果然有,看来有跟我一样的使用习惯的人。传统切换代理开关,步骤如下:设置=>网......
  • 【代理】【一】代理源码解析-导读
    1 什么是代理代理是指给某一个对象提供一个代理对象,代理对象持有原对象的引用。一句话通过代理对象增强原对象的功能,比如在原对象调用一个方法的前后进行日志、事务操作......
  • VPP 2110版本源码编译安装
    原文地址:https://www.cnblogs.com/liqinglucky/p/vpp.html一介绍官方文档:VPP/WhatisVPP?-fd.ioVPP平台是一个提供了交换机/路由器(switch/router)开箱即用(out-of......
  • 集群机制:注册表同步以及高可用源码剖析
    1在完成服务注册之后,会将注册信息同步给群里中的其他节点,以实现高可用,续约,服务更新,下线都是一样的操作2拿到集群中其他节点的url信息,同步数据3执行批处理任务,ba......
  • 多级缓存机制(包括缓存的主动过期、定时过期、被动过期)源码剖析
    1多级缓存入口2初始化缓存3二级缓存(读写缓存)readWriteCacheMap,每隔180s就会主动过期4一级缓存(只读缓存)readOnlyCacheMap,每隔30s自动刷新一次(定时过期)5......
  • java基础 -- 反射深入浅出与CLass源码解析
    java反射在运行状态中,对于任意的一个类,都能够知道这个类的所有属性和方法,对任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息及动态调用类对象方法的......
  • 框架源码 -- spring aware
    框架源码–springawarebean实现了Aware系列接口可以访问Spring容器,其中涉及到bean的创建过程,其中包括BeanNameAware,BeanFactoryAware,ApplicationContextAware都有参与b......
  • 自动故障感知以及服务实例自动摘除源码剖析
    1每隔1min调度一次EvictionTask这个任务,感知是否有实例故障,并摘除eureka-server初始化完成,进入下面这个方法registry.openForTraffic(applicationInfoManager,regist......
  • 2-1-4.spring源码--AbstractApplicationContext
    Spring源码–AbstractApplicationContext概述江湖上流传这样一个传说,只要把spring的refresh()搞明白,spring就学的七七八八了。今天来盘一下refresh方法,这个这是一个困难点了......
  • 服务下线源码剖析
    1client正常下线之前,会调用这个关闭的方法2释放线程池等资源3将实例状态设置为down,发送http请求调用server的cancel()方法4释放网络等资源......