Java反射的使用和原理详解

 更新时间:2024年01月22日 09:21:39   作者:我不是欧拉_  
这篇文章主要介绍了Java反射的使用和原理详解,反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作,需要的朋友可以参考下

1. 反射是什么?

反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作。

反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意方法和属性,这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

一句话总结:反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应的方法。

2. 为什么要用反射?

Java Reflection功能非常强大,并且非常有用,比如:

  • 获取任意类的名称、package信息、所有属性、方法、注解、类型、类加载器等
  • 获取任意对象的属性,并且能改变对象的属性
  • 调用任意对象的方法
  • 判断任意一个对象所属的类
  • 实例化任意一个类的对象
  • 通过反射我们可以实现动态装配,降低代码的耦合度,动态代理等。

3. 怎么使用反射?

一般情况下我们通过反射创建类对象主要有两种方式:

  1. 通过 Class 对象的 newInstance() 方法
  2. 通过 Constructor 对象的 newInstance() 方法

第一种:通过 Class 对象的 newInstance() 方法。

  • Class clz = Class.forName("com.mikechen.reflection.JiaGou");
  • JiaGou jg= (JiaGou)clz.newInstance();

第二种:通过 Constructor 对象的 newInstance() 方法

  • Class clz = Class.forName("com.mikechen.reflection.JiaGou");
  • Constructor constructor = clz.getConstructor();
  • JiaGou jg= (JiaGou)constructor.newInstance();

通过 Constructor 对象创建类对象可以选择特定构造方法,而通过 Class 对象则只能使用默认的无参数构造方法,下面的代码就调用了一个有参数的构造方法进行了类对象的初始化。

  • Class clz = Class.forName("com.mikechen.reflection.JiaGou");
  • Constructor constructor = clz.getConstructor(String.class);
  • JiaGou jg= (JiaGou)constructor.newInstance("mikechen的互联网架构");

接下来我们就可以通过具体的API调用获取到详细的属性或者方法等详细了。

3.1 获取类的成员变量的信息

Field[] fields = cls.getDeclaredFields();

3.2 获得类方法

Method[] methods = cls.getDeclaredMethods();

3.3 获得构造函数

Constructor[] constructors = cls.getDeclaredConstructors();

这样通过反射就可以做在运行时获取类的完整构造,并获得类信息了。

4. 反射工作原理

调用反射的总体流程如下:

1、当我们编写完一个Java项目之后,每个java文件都会被编译成一个.class文件。

2、这些class文件在程序运行时会被ClassLoader加载到JVM中,当一个类被加载以后,JVM就会在内存中自动产生一个Class对象。

3、通过Class对象获取Field/Method/Construcor

我们一般平时是通过new的形式创建对象实际上就是通过这些Class来创建的,只不过这个class文件是编译的时候就生成的,程序相当于写死了给jvm去跑。

反射是什么呢?当我们的程序在运行时,需要动态的加载一些类,这些类可能之前用不到所以不用加载到jvm,而是在运行时根据需要才加载。

原来使用new的时候,需要明确的指定类名,这个时候属于硬编码实现,而在使用反射的时候,可以只传入类名参数,就可以生成对象,降低了耦合性,使得程序更具灵活性。

5. 反射的应用场景

举个例子我们的项目底层数据库有时是用mysql,有时用oracle,需要动态地根据实际情况加载驱动类,这个时候反射就有用了,假设 com.mikechen.java.myqlConnection,com.mikechen.java.oracleConnection这两个类我们要用。

这时候我们在使用 JDBC 连接数据库时使用 Class.forName()通过反射加载数据库的驱动程序,如果是mysql则传入mysql的驱动类,而如果是oracle则传入的参数就变成另一个了。

Spring 框架的 IOC(动态加载管理 Bean),Spring通过配置文件配置各种各样的bean,你需要用到哪些bean就配哪些,spring容器就会根据你的需求去动态加载,你的程序就能健壮地运行。

还有Spring AOP(动态代理)功能都和反射有关系。

除此之外还有很多框架:mybatis、dubbo、rocketmq等等都会用到反射机制。

到此这篇关于Java反射的使用和原理详解的文章就介绍到这了,更多相关Java反射内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java报错:java.lang.UnsatisfiedLinkError问题的解决办法

    Java报错:java.lang.UnsatisfiedLinkError问题的解决办法

    在Java开发中,java.lang.UnsatisfiedLinkError是一种与本地方法调用相关的常见异常,本文将详细分析这一异常的背景、可能的原因、错误代码示例、正确代码示例,以及编写代码时需要注意的事项,需要的朋友可以参考下
    2024-09-09
  • JAVA POI设置EXCEL单元格格式用法举例

    JAVA POI设置EXCEL单元格格式用法举例

    这篇文章主要给大家介绍了关于JAVA POI设置EXCEL单元格格式用法的相关资料,POI中可能会用到一些需要设置EXCEL单元格格式的操作,需要的朋友可以参考下
    2023-08-08
  • springboot整合curator实现分布式锁过程

    springboot整合curator实现分布式锁过程

    这篇文章主要介绍了springboot整合curator实现分布式锁过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • python实现高斯模糊及原理详解

    python实现高斯模糊及原理详解

    高斯模糊是一种常见的模糊技术,本文主要介绍了python实现高斯模糊及原理详解,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • Java中将Html转换为PDF的方法和步骤

    Java中将Html转换为PDF的方法和步骤

    这篇文章主要介绍了Java中如何将Html转换为PDF的方法,文中有相关的代码示例和步骤讲解,感兴趣的同学可以参考阅读
    2023-06-06
  • Java经典面试题之NIO多路复用

    Java经典面试题之NIO多路复用

    JAVA NIO 的多路复用是面试中经常被问的问题,今天我们彻底搞明白究竟是怎么回事,文中的示例代码讲解详细,希望对大家学习Java有所帮助
    2023-06-06
  • java“与”符号写法与用法

    java“与”符号写法与用法

    在本篇文章里小编给大家整理的是关于java“与”符号写法与用法,对此有需要的朋友们可以学习下。
    2020-02-02
  • Springboot使用jxls实现同sheet多个列表展示

    Springboot使用jxls实现同sheet多个列表展示

    这篇文章主要介绍了Springboot使用jxls实现同sheet多个列表展示,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Spring框架如何使用P命名空间进行注入

    Spring框架如何使用P命名空间进行注入

    这篇文章主要介绍了Spring框架如何使用P命名空间进行注入,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • 基于Comparator对象集合实现多个条件按照优先级的比较

    基于Comparator对象集合实现多个条件按照优先级的比较

    这篇文章主要介绍了基于Comparator对象集合实现多个条件按照优先级的比较,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07

最新评论