网站首页 > 技术文章 正文
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万字《阿里架构师进阶专题合集》里面。
猜你喜欢
- 2025-07-27 JPA实体类注解,看这篇就全会了(java实体类注解)
- 2025-07-27 javaEE 新闻管理系统 oracle11+tomcat6
- 2025-07-27 SpringBoot 注解最全详解,建议收藏!
- 2024-10-28 从源码里的一个注释,我追溯到了12年前,有点意思
- 2024-10-28 Oracle数据库下使用PL/SQL编程 oracle数据库中,如何在sqlplus中执行sql脚本
- 2024-10-28 Spring注解驱动之后再说事务啊 spring事物注解失效
- 2024-10-28 让清华毕业大牛带你:深入了解Java中的注解,你能吸收到多少呢?
- 2024-10-28 使用自定义注解和切面AOP实现Java程序增强
- 2024-10-28 sql注入fuzz bypass waf SQL注入对于所有数据库的注入方法是一样的
- 2024-10-28 Java 深度历险:Java 注解 java注解是什么意思
你 发表评论:
欢迎- 633℃几个Oracle空值处理函数 oracle处理null值的函数
- 626℃Oracle分析函数之Lag和Lead()使用
- 614℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 608℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 606℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 599℃【数据统计分析】详解Oracle分组函数之CUBE
- 588℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 574℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
-
- CVE-2025-30762|Oracle(java oracle)
- 低代码可能铲不掉“屎山”,但能让这个它更有「型」
- 科技大事件:新苹果手表可通过击掌或握手来传递信息
- 你的百万级上下文窗口大模型,可能并没有你想象中那么强
- DApp 开发中的安全测试(软件测试过程中安全测试的具体应用场景和测试思路)
- 盘点Java中最没用的知识⑧:这3个过时套路,你还在代码里硬撑?
- 机房硬件设备及Oracle数据库软件维护服务项目竞争性磋商公告
- 微软与甲骨文扩大合作关系,推出Oracle Database@Azure
- JPA实体类注解,看这篇就全会了(java实体类注解)
- Java反射机制最全详解(图文全面总结)
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)