广告
返回顶部
首页 > 资讯 > 精选 >如何深度剖析Java反射机制中的动态代理原理
  • 951
分享到

如何深度剖析Java反射机制中的动态代理原理

2023-06-17 11:06:25 951人浏览 泡泡鱼
摘要

本篇文章给大家分享的是有关如何深度剖析Java反射机制中的动态代理原理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。动态代理类原理 示例代码参见《Java反射机制剖析:简单谈谈

本篇文章给大家分享的是有关如何深度剖析Java反射机制中的动态代理原理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

动态代理类原理 示例代码参见《Java反射机制剖析:简单谈谈动态代理》)

a) 理解上面的动态代理示例流程

如何深度剖析Java反射机制中的动态代理原理

b) 代理接口实现类源代码剖析

咱们一起来剖析一下代理实现类($Proxy0)的源代码和整个动态代理的流程。

$Proxy0生成的代码如下:

import java.lang.reflect.InvocationHandler;  import java.lang.reflect.Method;  import java.lang.reflect.Proxy;  import java.lang.reflect.UndeclaredThrowableException;     public final class $Proxy0 extends Proxy implements Manager {     private static Method m1;  private static Method m0;  private static Method m3;  private static Method m2;     static {     try {      m1 = Class.forName("java.lang.Object").getMethod("equals",        new Class[] { Class.forName("java.lang.Object") });      m0 = Class.forName("java.lang.Object").getMethod("hashCode",        new Class[0]);      m3 = Class.forName("com.ml.test.Manager").getMethod("test",        new Class[0]);      m2 = Class.forName("java.lang.Object").getMethod("toString",        new Class[0]);     } catch (NoSuchMethodException nosuchmethodexception) {      throw new NoSuchMethodError(nosuchmethodexception.getMessage());     } catch (ClassNotFoundException classnotfoundexception) {      throw new NoClassDefFoundError(classnotfoundexception.getMessage());     }  }     public $Proxy0(InvocationHandler invocationhandler) {     super(invocationhandler);  }     @Override public final boolean equals(Object obj) {     try {      return ((Boolean) super.h.invoke(this, m1, new Object[] { obj }))        .booleanValue();     } catch (Throwable throwable) {      throw new UndeclaredThrowableException(throwable);     }  }     @Override public final int hashCode() {     try {      return ((Integer) super.h.invoke(this, m0, null)).intValue();     } catch (Throwable throwable) {      throw new UndeclaredThrowableException(throwable);     }  }     public final void test() {     try {      super.h.invoke(this, m3, null);      return;     } catch (Error e) {     } catch (Throwable throwable) {      throw new UndeclaredThrowableException(throwable);     }  }     @Override public final String toString() {     try {      return (String) super.h.invoke(this, m2, null);     } catch (Throwable throwable) {      throw new UndeclaredThrowableException(throwable);     }  }  }

引入眼帘的是这个代理接口实现类实现了业务类的接口(也就是例子中的UserManager接口),又继承了基类Proxy类;

接着就是构造函数,在构造方法中把Businesshandler传过去,接着$Proxy0调用父类Proxy的构造器,为h赋值(这里要看Proxy的构造方法);

随后看到的就是这个类重写了Proxy类的Equals、hashCode、toString方法,又实现了业务类接口的方法(即UserManager的test方法),具体重写和实现都是用到的super.h.invoke(即Proxy.h.invoke)这个方法。

简单分析完这个代理接口实现类,咱们下面来整体看一下这个动态代理是怎么实现的:

首先客户端初始化了BusinessHandler类,调用这个类的newProxyInstance(new UserManagerImpl())方法来初始化了上面的代理接口实现类;

接下来代理接口实现类通过构造函数把BusinessHandler传过去(也就是代码中的this),并通过Proxy的构造函数给h赋值;

随后再客户端就能实例化出代理接口实现类$Proxy0,我们把它强制转换为业务实现接口(UserManager)类型的(为什么要强制转换,这里非常有意思,如果不强制转换就会报错,这里很好解释,因为当前的环境根本不会知道这个代理接口实现类$Proxy0既继承Proxy又实现业务实现接口UserManager,但是强制转换成UserManager它是可以做到的,因为当前环境中就有UserManager。这就是反射的厉害之处,可以在运行时动态调用任何一个类并可以使用这个类的具体细节。);

之后当我们调用test方法的时候其实是调用了$Proxy0中的test方法,这个方法的实现是通过Proxy.h的invoke方法实现的(即调用了BusinessHandler.invoke方法);

之后在调用了Method的invoke方法(这时的参数是this,和args)。

这样就调用了UserManagerImpl的对应方法,之后返回给客户端。

到此就完成了整个的调用关系。

反射,反射,程序员的快乐

通过上篇文章对动态代理进行了深度剖析,现在想起来还感觉非常有意思,这里面其实最根本的机制就是反射机制,运行时动态实例化任何一个类,并且调用它的具体细节。现在反看动态代理的示例,其实发现这里最关键的还是在就在Proxy.newProxyInstance(..)方法执行时生成了$Proxy0的内存字节码这一点上,当我们有了内存字节码,我们的反射就会大显威力,这样才有了我们之后的一系列的调用关系。

通过反射机制的分析和动态代理示例的剖析,发现编程是一件多么有意思的事情,以至于我们沉浸其中不能自拔。

以上就是如何深度剖析Java反射机制中的动态代理原理,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网精选频道。

--结束END--

本文标题: 如何深度剖析Java反射机制中的动态代理原理

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

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

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

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

下载Word文档
猜你喜欢
  • 如何深度剖析Java反射机制中的动态代理原理
    本篇文章给大家分享的是有关如何深度剖析Java反射机制中的动态代理原理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。动态代理类原理 示例代码参见《Java反射机制剖析:简单谈谈...
    99+
    2023-06-17
  • 深度剖析java中JDK动态代理机制
    摘要相比于静态代理,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定一组接口及目标类对象就能动态的获得代理对象。代理模式使用代理模式必须要让代理类和目标类实现相同的接口,客户端通过代理类来调用目标方法,代理类会将所有的方法调用...
    99+
    2023-05-31
    jdk 动态代理 ava
  • Java反射机制中动态代理的示例分析
    这篇文章主要介绍了Java反射机制中动态代理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 代理模式代理模式就是为其他对象提供一种代理来控制对这个对象的访问。其...
    99+
    2023-06-17
  • Java中反射机制和动态代理的示例分析
    这篇文章主要介绍了Java中反射机制和动态代理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、反射概述反射机制指的是Java在运行时候有一种自观的能力,能够了解自...
    99+
    2023-06-15
  • 详解Java中的反射机制和动态代理
    目录一、反射概述二、反射之Class类2.1、初识Class类2.2、Class有下面的几个特点2.3、获取Class类实例2.4、关于包装类的静态属性2.5、通过Class类的其他...
    99+
    2022-11-12
  • 深入浅析java 1.8 中动态代理的原理
    这篇文章将为大家详细讲解有关深入浅析java 1.8 中动态代理的原理,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。JDK8动态代理源码分析动态代理的基本使用就不详细介绍了:例子:class...
    99+
    2023-05-31
    java 动态代理 ava
  • Java中动态代理机制的原理是什么
    今天就跟大家聊聊有关Java中动态代理机制的原理是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java 动态代理机制的出现,使得 Java  开发人员不用手工编写代理...
    99+
    2023-06-17
  • 从另一个角度理解Java中的动态代理机制
    本篇文章为大家展示了从另一个角度理解Java中的动态代理机制,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。class文件简介及加载Java编译器编译好Java文件之后,产生.class 文件在磁盘中...
    99+
    2023-05-31
    java 动态代理 ava
  • Java中使用反射机制如何实现一个Aop代理
    今天就跟大家聊聊有关Java中使用反射机制如何实现一个Aop代理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。利用反射生成JDK的动态代理,也就是AOP中的AOP代理,代替目标对象,...
    99+
    2023-05-31
    java aop 反射
  • 如何探讨Java代理模式与反射机制的实际应用
    如何探讨Java代理模式与反射机制的实际应用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java提供了一套机制来动态执行方法和构造方法,以及数组操作等,这套机制就叫反射。而代...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作