Java反射机制最全详解(图文全面总结)
Java反射是各种框架以及中间件实现的基石,也是大厂面试重点考察内容,下面全面来详解Java反射机制@mikechen
本篇已收于mikechen原创超30万字《阿里架构师进阶专题合集》里面。
Java反射就是指:在运行状态中,对于任意一个类,都能够知道这个类的所有属性、方法等。
这种动态获取的信息,以及动态调用对象的方法的功能,我们称为Java反射机制。
Java反射功能非常强大,如下图所示:
- 获取任意类的名称、package信息、所有属性、方法、注解、类型、类加载器等;
- 获取任意对象的属性,用任意对象的方法,并且能改变对象的属性;
- 通过反射我们可以实现动态装配,降低代码的耦合度,动态代理等。
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反射机制。
一般情况下我们通过反射创建类对象主要有两种方式:
第一种:通过 Class 对象的 newInstance() 方法
如下所示:
第二种:通过 Constructor 对象的 newInstance() 方法
如下所示:
如下所示:
更加详细成员变量获取参考如下:
Java反射方法获取,如下所示:
更加详细方法获取参考如下:
Java反射获得构造函数,如下所示:
更加详细构造函数获取参考如下:
调用反射的总体流程如下:
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反射机制用法详解
小伙伴们在使用java开发的时候,经常会遇到反射机制的问题,今天就来相机介绍下这种强大的机制。
Java反射机制是一种强大的功能,允许程序在运行时动态地获取类的信息并操作这些信息。以下是对Java反射的详细解释:
- 定义:Java反射是指在运行时动态地获取类的信息并操作这些信息的能力[^1^][^2^][^3^]。通过反射,开发者可以在运行时检查类的结构(包括构造函数、方法、字段等),并调用这些方法或访问这些字段[^1^]。
- 核心类:Java反射机制的核心是java.lang.reflect包,它提供了相关类和接口,供我们使用[^3^]。
在Java中,每个类都有一个对应的Class对象,可以通过以下几种方式获取:
- 通过类名获取:Class<?> clazz = Class.forName(\”com.example.MyClass\”);
- 通过对象获取:MyClass obj = new MyClass(); Class<?> clazz = obj.getClass();
- 通过类字面量获取:Class<MyClass> clazz = MyClass.class;
通过Class对象可以获取类的构造函数:
通过Class对象可以获取类的方法:
通过Class对象可以获取类的字段:
- 框架开发:许多框架(如Spring、Hibernate)使用反射来实现依赖注入、对象关系映射等功能[^1^]。
- 动态代理:反射可以用于创建动态代理,实现AOP(面向切面编程)[^1^]。
- 单元测试:在单元测试中,反射可以用于模拟对象的行为[^1^]。
- 插件系统:反射可以用于加载和执行插件[^1^]。
- 优点:灵活性高,扩展性强[^1^]。
- 缺点:性能开销大,安全性较低,可读性较差[^1^]。
假设有一个Person类,包含一个私有的name字段和一个公共的sayHello方法,通过反射机制,我们可以获取到Person类的构造函数和方法,并可以调用sayHello方法:
通过上述示例代码,我们可以看到反射机制的强大之处,在运行时获取到了Person类的构造函数和方法,并动态地创建对象并调用方法[^3^]。
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。