Java反射机制最全详解(图文全面总结)

createh53个月前 (02-18)技术教程38

Java反射是各种框架以及中间件实现的基石,也是大厂面试重点考察内容,下面全面来详解Java反射机制@mikechen

本篇已收于mikechen原创超30万字《阿里架构师进阶专题合集》里面。

Java反射

Java反射就是指:在运行状态中,对于任意一个类,都能够知道这个类的所有属性、方法等。

这种动态获取的信息,以及动态调用对象的方法的功能,我们称为Java反射机制。

为什么要用反射?

Java反射功能非常强大,如下图所示:

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

Java反射的应用场景?

Java反射的应用场景,如下图所示:

1)数据库驱动:项目底层数据库有时是用mysql,有时用oracle,需要动态地根据实际情况加载驱动类,这个时候反射就有用了。

2)Spring IOC:Spring IOC 通过配置文件配置各种各样的bean,你需要用到哪些bean就配哪些,这里会涉及到Java反射。

3)Spring AOP:Spring AOP的Java动态代理功能,都和Java反射有关系。

4)主流框架:除此之外还有很多Java开发框架:Mybatis、Dubbo、Rocketmq等等都会用到Java反射机制。

Java反射如何使用?

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

第一种:通过 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();

5.Java反射获取类的成员变量

如下所示:

//mikechen的互联网架构
Field[] fields = cls.getDeclaredFields();

更加详细成员变量获取参考如下:

Java反射方法参数

Java反射方法获取,如下所示:

//mikechen的互联网架构
Method[] methods = cls.getDeclaredMethods();

更加详细方法获取参考如下:

Java反射获得构造函数

Java反射获得构造函数,如下所示:

//mikechen的互联网架构 
Constructor[] constructors = cls.getDeclaredConstructors();

更加详细构造函数获取参考如下:

反射工作原理?

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

1.源文件转Class文件

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

如下图所示:

2.加载到JVM

编译好的class文件,在程序运行时会被ClassLoader加载到JVM中。

如下图所示:

当一个类被加载以后,JVM就会在内存中自动产生一个Class对象。

3.获取Class对象

被JVM加载进来后,就可以通过Class对象获取:属性、方法、构造函数。

如下图所示:

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

原来使用new的时候,需要明确的指定类名,这个时候属于硬编码实现,而在使用反射的时候,可以只传入类名参数,就可以生成对象。

通过Java反射机制,这样就可以极大的降低耦合性,使得程序更具灵活性,所以才会有很多Java开发框架都采用了Java反射,就是这个原因。

本篇已收于mikechen原创超30万字《阿里架构师进阶专题合集》里面。

相关文章

java中类变量和实例变量的实质区别?

类变量和实例变量的区别相对于static(静态的)或说类的, 本章开始提到的都是instance(实例的)或说对象的。 每个对象都有自己的一份儿对象域或实例域,相互之间没关系, 不共享。 我们可以从对...

Java变量、常量、运算符、数组_java常量与变量例子

变量(Variables)在 Java 中,变量用于存储程序运行时所需的数据(The data required during the runtime)。变量的声明(The declaration o...

python变量_python变量命名规则

什么是变量?变量是存放数据值的容器。Python 没有声明变量的命令。首次为其赋值时,才会创建变量。用现实世界来解释一下什么是变量,比如我要盛一碗小米粥,这个时候我需要一个碗才能完成这件事情,这个碗就...

Java初学者常见的10类问题_java入门例子

对于Java初学者来说,在学习过程中经常会遇到一些常见的问题。以下是Top 10常见问题及其解决方案:1. 环境配置问题问题:Java开发环境(如JDK、IDE)配置不正确。解决方案:确保正确安装了J...

别再被绕晕了!5分钟读懂成员变量和局部变量的所有区别!

#冬日生活分享#大家好呀,我是小米!今天跟大家聊一聊一个在Java面试中超高频出现的话题:成员变量与局部变量。无论是社招还是校招,关于这俩的考点总是层出不穷,面试官也总喜欢用它们来做“陷阱题”。今天...

final关键字有哪些作用?应用在类、方法和变量上会有什么效果?

“合抱之木,生于毫末;九层之台,起于累土。” 很多人对基础知识的巩固不够重视。Java 基础就如同大厦的基石,没有稳固的基石,再宏伟的架构也只是空中楼阁。检验知识是否学得牢固,有一个比较好的办法,假设...