时间:2022-10-09 15:34:52 | 浏览:385
反射非常强大和有用,现在市面上绝大部分框架(spring、mybatis、rocketmq等等)中都有反射的影子,反射机制在框架设计中占有举足轻重的作用。
所以,在你Java进阶的道路上,你需要掌握好反射。
怎么才能学好反射,我们需要弄懂以下几个问题:
1.反射是什么?
2.反射有什么用?
3.反射的实现原理?
4.怎么用反射?
下面我就针对以上的疑问,一一来讲解。
反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作。
反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意方法和属性,这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
一句话总结:反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应的方法。
Java Reflection功能非常强大,并且非常有用,比如:
获取任意类的名称、package信息、所有属性、方法、注解、类型、类加载器等
获取任意对象的属性,并且能改变对象的属性
调用任意对象的方法
判断任意一个对象所属的类
实例化任意一个类的对象
通过反射我们可以实现动态装配,降低代码的耦合度,动态代理等。
一般情况下我们通过反射创建类对象主要有两种方式:
通过 Class 对象的 newInstance() 方法
通过 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调用获取到详细的属性或者方法等详细了。
1、获取类的成员变量的信息
//mikechen的互联网架构Field[] fields = cls.getDeclaredFields();
更加详细成员变量获取参考如下:
2、获得类方法
//mikechen的互联网架构Method[] methods = cls.getDeclaredMethods();
更加详细方法获取参考如下:
3、获得构造函数
//mikechen的互联网架构 Constructor[] constructors = cls.getDeclaredConstructors();
更加详细构造函数获取参考如下:
这样通过反射就可以做在运行时获取类的完整构造,并获得类信息了。
通过以上一个小案例了解了反射的使用,但如果你想对反射掌握得更好,还需深入理解反射背后的底层实现原理。
调用反射的总体流程如下:
1、当我们编写完一个Java项目之后,每个java文件都会被编译成一个.class文件。
2、这些class文件在程序运行时会被ClassLoader加载到JVM中,当一个类被加载以后,JVM就会在内存中自动产生一个Class对象。
3、通过Class对象获取Field/Method/Construcor
我们一般平时是通过new的形式创建对象实际上就是通过这些Class来创建的,只不过这个class文件是编译的时候就生成的,程序相当于写死了给jvm去跑。
反射是什么呢?当我们的程序在运行时,需要动态的加载一些类这些类可能之前用不到所以不用加载到jvm,而是在运行时根据需要才加载。
原来使用new的时候,需要明确的指定类名,这个时候属于硬编码实现,而在使用反射的时候,可以只传入类名参数,就可以生成对象,降低了耦合性,使得程序更具灵活性。
举个例子我们的项目底层数据库有时是用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等等都会用到反射机制。
如果不满足于文章详解,私信【架构】获取视频详解!
IT之家 7 月 17 日消息,智能招聘平台 CodeSubmit 统计分析了 20 多个国家的软件开发者在 2022 年的薪资状况,并列出了排名数据。据统计,2022 年薪资最高的三个国家为:美国、瑞士和以色列。此外,丹麦、加拿大、挪威、
一、强类型和弱类型语言:C、 C++、 Java 、Python都是强类型的语言。PHP是弱类型的语言。强类型语言是一种强制类型定义的语言,即一旦某一个变量被定义类型,如果不经强制转换,那么它永远就是该数据类型。而弱类型语言是一种弱类型定义
PHP代码优化最佳实践编写好的PHP代码是创建快速稳定Web应用的关键一步。从一开始就遵循一些最佳实践技巧将节省后期填坑的时间。1. 尽可能的使用PHP的内置方法只要可以尽可能的使用PHP的内置方法,而不是自己编写相同功能的方法。花点时间去
编程语言是开发者们代码工作的核心,也是许多开发者最爱讨论的话题。编程语言的选择对开发者和工具制造商都十分重要,前者需要保持最新和具备市场潜力的技能,后者则亟需确保他们能够提供最有用的 SDK。开发者经济分析公司 SlashData 曾发布了
首先我们得知道Java和php都是一种后端开发语言。而后端开发语言是做什么用的呢?后端语言主要应用于网站架构建设、业务流程开发及数据库的开发。所以它的强大可想而知了。但是后端开发语言如果要详细统计不下十种,有Java、php、Python、
【51CTO.com快译】JavaScript与PHP,都是目前人气较高的两款编程语言。PHP是基于C语言而打造,因此非常适合有C语言基础的开发者。事实上,两种语言对于新手程序员来说都是比较容易上手的,而且它们都具备出色的灵活性与可扩展性。
来自:知乎链接:https://www.zhihu.com/question/20314377黄良懿,做做架构,写写代码// 技术日新月异,回答放一段时间不更新会变味啊。前两周参加完 ThinkInLamp 的 PHP 架构师大会,听鸟哥一
IT行业现在依然是求职转行人群的首选,那么当下的IT培训机构中IT技术课程类目繁多,尤其是Java培训,PHP培训,Python培训以及前端培训最火,零基础人员如何选择一种适合自己的编程开发语言课程去学习入行呢?前三者属于后端的开发语言,我
现在很多人都很想去培训,可是看到有培训出来就业不好的情况,就容易打消培训的念头,所以对于后面想学习的同学选择培训学校时一定要擦亮眼睛!就业不好的肯定是因为技术不行,因为就业的根本是技术!一定要选“技术型”机构,不要选“营销型”机构!对于没有
给大家带来的一篇关于PHP编程相关的电子书资源,介绍了关于PHP、编程入门、应用方面的内容,本书是由清华大学出版社出版,格式为PDF,资源大小500 MB,李鑫、王瑞敬编写,目前豆瓣、亚马逊、当当、京东等电子书综合评分为:9.6。在近几年中