首页 > 其他分享 >JDK实现动态代理

JDK实现动态代理

时间:2023-03-19 14:23:17浏览次数:31  
标签:invoke JDK 对象 Object 代理 目标 动态 方法

动态代理

基本介绍
  1. 代理对象,不需要实现接口,但是目标对象要实现接口,否则不能用动态代理。
  2. 代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象。
  3. 动态代理也叫作:JDK代理,接口代理。
JDK 中生成代理对象的API
  1. 代理类所在包:java.lang.reflect.Proxy
  2. JDK实现代理只需要使用newProxyInstance方法,但是该方法需要接收三个参数,完整的写法是:
/*
	newProxyInstance详解:
		功能:
         1. 接收传入的对象,获取目标对象。
         2. 通过反射机制,获取相关的代理对象。
         3. 通过代理对象,调用目标对象方法。
*/
static Object newProxyInstance (ClassLoader loader, 
                                // 指定当前目标对象的类加载器,获取类加载器的方法固定
                                Class<?>[] interfaces,
                                // 目标对象实现的接口类型,使用泛型方法确定数据类型
                                InvocationHandler h 
                                // 代理对象的核心,事件处理,执行目标对象的方法时,会触发事件处理器的方法,会将当前执行的目标对象方法作为参数传入。
                               ); 

★ 返回类型:函数返回的类型是 Object类型,但是我们要得到的代理对象应该声明为 目标对象的接口类型(代理类型)。

易错重点】 如果要代理的目标对象是一般类,那么 newProxyInstance 的返回值类型 一般不强转为 目标对象的类型,必须强转为 包含代理目标对象方法的 接口的类型。

InvocationHandler 接口详解:(称为调用处理器)

InvocationHandler是一种函数式接口,内部定义了一个invoke方法,是代理对象的核心处理方法。

private Ojbect target = 目标对象;

new InvocationHandler () {
   @Override 
   public Object invoke(Object proxy, Method method, Object[] args) {
       // 自定义方法实现, 一般是method反射机制调用目标对象的方法,进行增强。
       return null;
   }
}

invoke方法参数详解:

  1. proxy:代表的是目标对象的代理对象,invoke 方法可以返回 调用代理对象方法的返回结果,也可以返回对象的代理对象。通常 作为invoke方法的第一参数。
  2. method: 代表的是 代理对象调用的方法 -- (代理对象可以直接调用目标对象的接口中所有的方法)。
  3. args:代表的是 代理对象调用方法时,所传入的参数。
  4. 通常 自定义一个 private Ojbect target = 目标对象 ,在 invoke 方法中调用method 时,需要传入目标对象 method.invoke(Object target, Ojbect[] args);

标签:invoke,JDK,对象,Object,代理,目标,动态,方法
From: https://www.cnblogs.com/oneblogs/p/17233000.html

相关文章

  • 代理模式
    1静态代理2什么是动态代理?动态代理是通过创建代理对象,在不改变原有代码的基础上,给程序增加新的功能,实现了程序的功能增强3动态代理有哪些JDK动态代理CGLB动态......
  • 代理配置解决跨域问题
    在vue.config.js文件中添加配置module.exports={transpileDependencies:true,lintOnSave:false,//代理配置,但是它只在开发环境有效devServer:{pro......
  • 探究C# dynamic动态类型本质
    本周在做接口动态传参的时候思考了个问题:如何把一个json字符串,转成C#动态类?比如由{'userId':100,'id':1,'title':'helloworld','completed':f......
  • linux查看openjdk的安装的路径
     前言:现在基本上linux为了避免版权问题都会默认的为你安装开源的openjdk,而不是jdk。有些时候需要运行一些环境需要用到jdk的环境变量,本文就是简单描述下如何查看openj......
  • Java三大版本。JDK、JRE、JVM
    JavaSE:标准版(桌面程序,控制台开发...)JavaME:嵌入式开发(手机,小家电...)JavaEE:E企业级开发(Web端,服务器开发...)JDK:javadevelopmentkitJava开发者工具JRE:javaruntimeen......
  • 终端代理
    Clash:写入文件vim~/.bash_profile    点击查看代码#Clashproxyaliasxu_proxy="exporthttps_proxy=http://127.0.0.1:7890;exporthttp_proxy=http:......
  • 代码随想录算法训练营Day46 动态规划
    代码随想录算法训练营代码随想录算法训练营Day46动态规划|● 139.单词拆分关于多重背包,你该了解这些!背包问题总结篇!139.单词拆分题目链接:139.单词拆分给定一......
  • java进阶 JDK7 -日期48
           packagecom.cyjt97.dt;importjava.util.Date;publicclassday{publicstaticvoidmain(String[]args){Datedt=newDate();......
  • 动态规划之背包问题
    背包问题1.01背包问题有N件物品和一个容量是V的背包。每件物品只能使用一次。第i件物品的体积是\(v_i\),价值是\(w_i\)。求解将哪些物品装入背包,可使这些物品的总体......
  • React 实现 动态加载组件
    React实现动态加载组件import{Button}from'antd'importReact,{useState,lazy,Suspense}from'react'//这个地方动态加载组件constItem=lazy(()=>i......