大家好,我是猿人(猿码天地创始人),今天给码农们或即将成为码农或想成为码农的朋友讲讲JAVA反射机制详解,看完还学不会你来捶我,现在是深夜23:00分,猿人最擅长熬夜,就是不怕掉头发!一切都是为了亲爱的粉丝朋友能学到知识,猿人熬夜也是值得的!
好,废话不多说,直接干,进入正题:Good Good Study,Day Day Up!
我是「猿码天地」,一个热爱技术、热爱编程的IT猿。技术是开源的,知识是共享的!
写作是对自己学习的总结和记录,如果您对 Java、分布式、微服务、中间件、Spring Boot、Spring Cloud等技术感兴趣,可以关注我的动态,我们一起学习,一起成长!
用知识改变命运,让家人过上更好的生活,互联网人一家亲!
1. 什么是反射?
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
2. 用途
在日常的第三方应用开发过程中,经常会遇到某个类的某个成员变量、方法或是属性是私有的或是只对系统应用开放,这时候就可以利用Java的反射机制通过反射来获取所需的私有成员或是方法。
一般而言,当用户使用一个类的时候,应该获取这个类,而后通过这个类实例化对象,但是使用反射则可以相反的通过对象获取类中的信息。
通俗的讲反射就是可以在程序运行的时候动态装载类,查看类的信息,生成对象,或操作生成的对象。它允许运行中的 Java 程序获取自身的信息。
3. 反射机制相关的类
类名 | 用途 |
---|---|
Class类 | 代表类的实体,在运行的Java应用程序中表示类和接口 |
Field类 | 代表类的成员变量(成员变量也称为类的属性) |
Method类 | 代表类的方法 |
Constructor类 | 代表类的构造方法 |
-
Class类
Class代表类的实体,在运行的Java应用程序中表示类和接口。在这个类中提供了很多有用的方法,这里对他们简单的分类介绍。
获得类相关的方法
![](https://img-blog.csdnimg.cn/img_convert/e37a746e12f35054b344c0813107f130.png)
获得类中属性相关的方法
![](https://img-blog.csdnimg.cn/img_convert/c91416a233f74c43ec7736ac8ae5d1a9.png)
获得类中注解相关的方法
![](https://img-blog.csdnimg.cn/img_convert/8b52861d268b588ec625255b022a9fd5.png)
获得类中构造器相关的方法
![](https://img-blog.csdnimg.cn/img_convert/52793aa6040ccfe8fbddb850c8572ea1.png)
获得类中方法相关的方法
![](https://img-blog.csdnimg.cn/img_convert/23cd8f4349128c33859391916ff2b2dd.png)
类中其他重要的方法
![](https://img-blog.csdnimg.cn/img_convert/8f18f3b4e861ff00d226771d2faa7c9a.png)
-
Field类
Field代表类的成员变量(成员变量也称为类的属性)
![](https://img-blog.csdnimg.cn/img_convert/25edccaefdcda905bec74b8411c16f34.png)
-
Method类
Method代表类的方法。
![](https://img-blog.csdnimg.cn/img_convert/24d699cfeed2d20f8312a9f4ff774bcd.png)
-
Constructor类
Constructor代表类的构造方法。
![](https://img-blog.csdnimg.cn/img_convert/7a1ee7db601fc5e71af6c251803d168b.png)
4. Java 反射机制相关面试题
反射机制是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。
-
java反射的作用是什么?
反射机制是在运行时,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意个对象,都能够调用它的任意一个方法。在java中,只要给定类的名字,就可以通过反射机制来获得类的所有信息。这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
-
Java反射创建对象效率高还是通过new创建对象的效率高?
通过new创建对象的效率比较高。通过反射时,先找查找类资源,使用类加载器创建,过程比较繁琐,所以效率较低。
-
除了使用new创建对象之外,还可以用什么方法创建对象?
使用Java反射可以创建对象。
-
反射的实现方式都有什么?
获取Class对象,有4种方法:(1)Class.forName(“类的路径”);(2)类名.class;(3)对象名.getClass();(4)基本类型的包装类,可以调用包装类的Type属性来获得该包装类的Class对象。
-
实现java反射的类有什么?
(1)Class:表示正在运行的Java应用程序中的类和接口,注意所有获取对象的信息都需要Class类来实现;(2)Field:提供有关类和接口的属性信息,以及对它的动态访问权限;(3)Constructor:提供关于类的单个构造方法的信息以及它的访问权限;(4)Method:提供类或接口中某个方法的信息。
-
反射机制的优缺点
优点:(1)能够运行时动态获取类的实例,提高灵活性;(2)与动态编译结合Class.forName('com.mysql.jdbc.Driver.class');//加载MySQL的驱动类
缺点:使用反射性能较低,需要解析字节码,将内存中的对象进行解析。
其解决方案是:通过setAccessible(true)关闭JDK的安全检查来提升反射速度;多次创建一个类的实例时,有缓存会快很多;ReflflectASM工具类,通过字节码生成的方式加快反射速度。
-
Java反射API有几类