iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java动态代理中如何进行InvocationHandler最简单的入门
  • 797
分享到

Java动态代理中如何进行InvocationHandler最简单的入门

2023-06-02 22:06:41 797人浏览 泡泡鱼
摘要

Java动态代理中如何进行InvocationHandler最简单的入门,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。网上关于Java的动态代理,Proxy和I

Java动态代理中如何进行InvocationHandler最简单的入门,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

网上关于Java的动态代理,Proxy和InvocationHandler这些概念有讲解得非常高深的文章。其实这些概念没有那么复杂。现在咱们通过一个最简单的例子认识什么是InvocationHandler。值得一提的是,InvocationHandler在spring框架实现中被广泛使用,这意味着我们吃透了InvocationHandler,就为将来的Spring源码学习打下一个坚实的基础。

开发一个接口,包含两个方法,可以向指定的人问候“你好”或者“再见”。

public interface IHello {   void sayHello(String name);   void sayGoogBye(String name);}

创建一个简单的类,实现这个IHello接口。

public class Helloimplements implements IHello {    @Override    public void sayHello(String name) {        System.out.println("Hello " + name);    }    @Override    public void sayGoogBye(String name) {        System.out.println(name+" GoodBye!");    }}

消费这个实现类,迄今为止没什么特别的。

现在假设我们接到了这个需求:老板要求在该实现类每次问候某人时,必须把问候的细节记录到日志文件里。为了简单起见,我们在问候前打印下面的一行语句来模拟日志记录的动作。

System.out.println("问候之前的日志记录...");

您也许会说,这还不简单?直接修改Helloimplements的对应方法,把这行日志插入到对应方法即可。

Java动态代理中如何进行InvocationHandler最简单的入门

然而,老板的要求是:不允许你修改原来的Helloimplements类。在现实场景中,Helloimplements可能是第三方的jar包提供的,我们没有办法修改代码。

Java动态代理中如何进行InvocationHandler最简单的入门

您也许会说,我们可以用设计模式里的代理模式,即创建一个新的Java类作为代理类,同样实现IHello接口,然后将Helloimplements类的实例传入代理类。我们虽然被要求不允许修改Helloimplements的代码,但是可以把日志记录代码写在代理类里。完整代码如下:

public class StaticProxy implements IHello {  private IHello iHello;  public void setImpl(IHello impl){  this.iHello = impl;}@Overridepublic void sayHello(String name) {    System.out.println("问候之前的日志记录...");    iHello.sayHello(name);}@Overridepublic void sayGoogBye(String name) {     System.out.println("问候之前的日志记录...");     iHello.sayGoogBye(name);}static public void main(String[] arg) {     Helloimplements hello = new Helloimplements();     StaticProxy proxy = new StaticProxy();     proxy.setImpl(hello);     proxy.sayHello("Jerry");  }}

这种做法能够实现需求:

Java动态代理中如何进行InvocationHandler最简单的入门

下面我们再看如何用InvocationHandler实现同样的效果。

InvocationHandler是一个jdk提供的标准接口。看下面的代码:import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class DynaProxyHello implements InvocationHandler {    private Object delegate;    public Object bind(Object delegate) {        this.delegate = delegate;        return Proxy.newProxyInstance(        this.delegate.getClass().getClassLoader(), this.delegate        .getClass().getInterfaces(), this);    }    public Object invoke(Object proxy, Method method, Object[] args)    throws Throwable {        Object result = null;        try {            System.out.println("问候之前的日志记录...");            // JVM通过这条语句执行原来的方法(反射机制)            result = method.invoke(this.delegate, args);        }        catch (Exception e) {            e.printStackTrace();        }        return result;    }

上面代码里的bind方法很想我之前代理类StaticProxy的setImpl方法,只不过这个bind方法的输入参数类型更加通用。日志记录的代码写在方法invoke里。

看看如何使用:

static public void main(String[] arg) {    DynaProxyHello helloproxy = new DynaProxyHello();    Helloimplements hello = new Helloimplements();    IHello ihello = (IHello) helloproxy.bind(hello);    ihello.sayHello("Jerry");}

执行效果和StaticProxy那种解决方案完全一致。

咱们先来调试一下。当bind方法执行时,方法Proxy.newProxyInstance被调用,Helloimplements类的实例被传入。

Java动态代理中如何进行InvocationHandler最简单的入门

我们在调试器里观察IHello ihello = (IHello) helloproxy.bind(hello)这行语句返回的ihello变量。虽然它的静态类型是IHello,但请注意,在调试器里观察它的实际类型,并不是Helloimplements的实例,而是JVM给我们加过工的,包含了我们在invoke方法里手写的那行日志记录代码。这个ihello类型为$Proxy0。

Java动态代理中如何进行InvocationHandler最简单的入门

当这个被JVM加过工的变量的sayHello方法被调用时,JVM自动将调用转交到DynaProxyHello.invoke去:

Java动态代理中如何进行InvocationHandler最简单的入门

于是,在invoke方法里,我们手写的日志记录代码被执行,然后通过Java反射执行原始的sayHello代码。

有的朋友可能会问,你这个InvocationHandler看起来比静态代理StaticProxy还复杂啊?有什么好处?

假设老板的需求又变了,在调用问候和说再见的方法里,要使用不同的日志记录策略。

看看用InvocationHandler如何优雅实现吧:

Java动态代理中如何进行InvocationHandler最简单的入门

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网精选频道,感谢您对编程网的支持。

--结束END--

本文标题: Java动态代理中如何进行InvocationHandler最简单的入门

本文链接: https://www.lsjlt.com/news/231512.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java动态代理中如何进行InvocationHandler最简单的入门
    Java动态代理中如何进行InvocationHandler最简单的入门,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。网上关于Java的动态代理,Proxy和I...
    99+
    2023-06-02
  • java动态代理的简单使用
    本篇内容主要讲解“java动态代理的简单使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java动态代理的简单使用”吧!//---------------接口package refl...
    99+
    2023-06-02
  • 如何进行ActiveMQ的简单入门与使用
    这期内容当中小编将会给大家带来有关如何进行ActiveMQ的简单入门与使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、什么是消息中间件消息中间件顾名思义实现的就是在两个系统或两个客户端之间进行消息传...
    99+
    2023-06-21
  • 如何进行Java代理设计模式的静态代理和动态代理实现
    今天就跟大家聊聊有关如何进行Java代理设计模式的静态代理和动态代理实现,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。面试问题:Java里的代理设计模式一共有几种实现方式?这个题目很...
    99+
    2023-06-02
  • Java中如何进行TCP和套接字入门
    今天就跟大家聊聊有关Java中如何进行TCP和套接字入门,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。JDK 提供了对 TCP(Transmission Control Protoc...
    99+
    2023-06-17
  • Java如何通过动态代理实现一个简单的拦截器操作
    这篇文章主要介绍“Java如何通过动态代理实现一个简单的拦截器操作”,在日常操作中,相信很多人在Java如何通过动态代理实现一个简单的拦截器操作问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java如何通过动...
    99+
    2023-06-20
  • 深入浅析java 1.8 中动态代理的原理
    这篇文章将为大家详细讲解有关深入浅析java 1.8 中动态代理的原理,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。JDK8动态代理源码分析动态代理的基本使用就不详细介绍了:例子:class...
    99+
    2023-05-31
    java 动态代理 ava
  • 使用python进行数学建模系列1 读表格 +简单处理+ 画图简单入门 代码可直接运行
    为啥要用python呢             --没人能逃过真香定律 数学建模工具有很多种选择,有功能及其matlab,R语言,SPSS,Lingo等等,他们在不同领域各有擅场,但为什么极力推荐用python呢 其实很简单,上边每个软件能...
    99+
    2023-09-09
    python
  • 深入浅析java 中JDK的动态代理类
    这期内容当中小编将会给大家带来有关深入浅析java 中JDK的动态代理类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。详解java JDK 动态代理类分析(java.lang.reflect.Proxy)...
    99+
    2023-05-31
    java jdk 动态代理类
  • 如何进行JPA中JPQL的简单查询
    如何进行JPA中JPQL的简单查询,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。JPQL:Java持久化查询语言,以面向对象的查询语法构造查询语句。JPA使用j...
    99+
    2023-06-17
  • 深入浅析java 中的JDK与cglib动态代理
    这篇文章将为大家详细讲解有关深入浅析java 中的JDK与cglib动态代理,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。java 动态代理实例详解1.jdk动态代理 package com...
    99+
    2023-05-31
    java jdk cglib
  • Java通过动态代理实现一个简单的拦截器操作
    一、代理 在使用动态代理实现拦截器之前我们先简单了解一下什么Java的代理。 代理,顾名思义,就是不直接操作被代理(下面都用目标对象称呼,听起来舒服一些)对象,而是通过一个代理对象去...
    99+
    2024-04-02
  • 如何进行Java中对象与表单的自动装配
    这期内容当中小编将会给大家带来有关如何进行Java中对象与表单的自动装配,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。时下很多 Web 框架 都实现了 Form 表单域与 Java 对象属性的自动装配功能...
    99+
    2023-06-17
  • 如何进行Linux 容器的建立和简单管理
    如何进行Linux 容器的建立和简单管理,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。cgroups 简介LXC 项目由一个 Linux 内核补丁和一些用户空间...
    99+
    2023-06-16
  • Java怎么通过动态代理实现一个简单的拦截器操作
    本文小编为大家详细介绍“Java怎么通过动态代理实现一个简单的拦截器操作”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java怎么通过动态代理实现一个简单的拦截器操作”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
    99+
    2023-06-17
  • Java中的静态代码块是如何执行的
    Java中的静态代码块是如何执行的?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行...
    99+
    2023-05-31
    java ava
  • 如何深度剖析Java反射机制中的动态代理原理
    本篇文章给大家分享的是有关如何深度剖析Java反射机制中的动态代理原理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。动态代理类原理 示例代码参见《Java反射机制剖析:简单谈谈...
    99+
    2023-06-17
  • JavaScript版本中如何从最简单的斐波那契数列来学习动态规划
    这篇文章将为大家详细讲解有关JavaScript版本中如何从最简单的斐波那契数列来学习动态规划,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 前言...
    99+
    2024-04-02
  • Matlab中如何读取图片并进行简单的操作
    这篇文章主要介绍了Matlab中如何读取图片并进行简单的操作,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。01—Matlab的使用当我们打开软件的时候会看到如下的界面,图片中...
    99+
    2023-06-19
  • 如何进行PHP开发中表单的处理
    这篇文章将为大家详细讲解有关如何进行PHP开发中表单的处理,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。我终究还是低估了“妹子”两个字对程序猿们的杀伤力,在无图说个杰宝的今天,竟然还能在没有...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作