当前位置: 首页 > 后端技术 > Java

Java反射详解:入门+使用+原理+应用场景

时间:2023-04-01 13:50:05 Java

反射非常强大,非常好用。现在市面上的大部分框架(spring、mybatis、rocketmq等)都有反射的影子,而反射机制在框架设计中占有举足轻重的地位。所以,在Java进阶之路上,你需要掌握反射。如何学好反思,我们需要了解以下几个问题:1、什么是反思?2、反射有什么用?3、反射的实现原理是什么?4.如何使用反射?下面,我将对以上问题一一进行解释。什么是反射?反射是Java语言的一个特性,它允许程序在运行时检查自身并对内部成员进行操作(注意它不是编译的)。反射处于运行状态。对于任何一个类,你都可以知道这个类的所有属性和方法。对于任何对象,您都可以调用它的任何方法和属性。这种动态获取信息,动态调用对象方法的功能,称为java语言的反射机制。一句话总结:反射就是在运行时知道要操作的类是什么,并且能够在运行时获取类的完整结构并调用相应的方法。为什么要使用反射?JavaReflection非常强大有用,例如:获取任何类的名称、包信息、所有属性、方法、注解、类型、类加载器等。获取任何对象的属性,并可以改变对象的属性调用任意一个对象的方法,确定任意一个对象所属的类,实例化任意一个类的对象,通过反射,我们可以实现动态组装,降低代码耦合,动态代理等。如何使用反射?总的来说,我们通过反射创建类对象主要有两种方式:通过Class对象的newInstance()方法通过Constructor对象的newInstance()方法。第一种:通过Class对象的newInstance()方法。Classclz=Class.forName("com.mikechen.reflection.JiaGou");JiaGoujg=(JiaGou)clz.newInstance();第二种方法:通过Constructor对象的newInstance()方法();通过Constructor对象创建类对象可以选择具体的构造方法,而通过Class对象只能使用默认的无参构造方法,下面的代码调用一个有参构造方法来初始化类对象。classclz=Class.forName("com.mikechen.reflection.JiaGou");Constructorconstructor=clz.getConstructor(String.class);JiaGoujg=(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、这些类文件在程序运行时会被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容器会根据你的需要动态加载,你的程序才能健壮地运行。还有与反射相关的SpringAOP(动态代理)功能。另外还有很多框架:mybatis、dubbo、rocketmq等,都使用了反射机制。多于!作者简介:mikechen,10余年大厂架构经验,曾在阿里、淘宝、百度工作,分享10余年BAT架构经验及面试经验!关注个人公众号:mikechen的互联网架构,第一时间获取最新BAT架构技术干货分享!公众号后台回复架构,还可以获得我独家揭秘的Java工厂架构干货视频。近期必看热点文章1.史上最全阿里Java面试题库(2022最新版)2.2022金三银四一线大厂必看答案解析合集3.Java多线程与并发系列从0到1所有的合集4.从0到1的所有JVM(JavaVirtualMachine)的合集。5.详解单点登录SSO的原理和解决方案。6.史上最强消息队列MQ总结!