思考:在讲反射之前,先思考一个问题,java中如何创建一个对象,有哪几种方式?
Java中创建对象大概有这几种方式:
1、使用new关键字:这是我们最常见的也是最简单的创建对象的方式
2、使用Clone的方法:无论何时我们调用一个对象的clone方法,JVM就会创建一个新的对象,将前面的对象的内容全部拷贝进去
3、使用反序列化:当我们序列化和反序列化一个对象,JVM会给我们创建一个单独的对象
上边是Java中常见的创建对象的三种方式,其实除了上边的三种还有另外一种方式,就是接下来我们要讨论的 “反射”
一、什么是反射?
1.1、概念
在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功能就称为java语言的反射机制。通俗点讲,通过反射,该类对我们来说是完全透明的,想要获取任何东西都可以。
想要使用反射机制,就必须要先获取到该类的字节码文件对象(.class),通过字节码文件对象,就能够通过该类中的方法获取到我们想要的所有信息(方法,属性,类名,父类名,实现的所有接口等等),每一个类对应着一个字节码文件也就对应着一个Class类型的对象,也就是字节码文件对象。
反射就是把Java类中的各种成分,映射成一个个的java对象,拿到这些对象后可以做一些事情。
例如,一个类有:成员变量,方法,构造方法,等信息,利用反射技术可以对一个类进行解剖,把各个组成部分映射成一个个对象。
1.2、反射能干什么
说完反射的概念后,要说一说反射能干什么?
一般来说反射是用来做框架的,或者说可以做一些抽象度比较高的底层代码,所以说有一句很经典的话:反射乃框架设计之灵魂。现在说完这个可能还不太能理解,不急,等下说完一个快速入门的例子后,应该会稍微有点感觉
二、获取Class对象的方式
1 Object ——> getClass(); 所有的Java类均继承了object类,在object类中定义了一个getclass()方法,该方法返回一个类型为Class的对象,
2 任何数据类型(包括基本数据类型)都有一个“静态”的class属性
3 通过Class类的静态方法:forName(String className)(常用)
- 获取Class对象的三种方式
- 1 Object ——> getClass();
- 2 任何数据类型(包括基本数据类型)都有一个“静态”的class属性
- 3 通过Class类的静态方法:forName(String className)(常用)
public class Fanshe {
public static void main(String[] args) {
//第一种方式获取Class对象
Student stu1 = new Student();//这一new 产生一个Student对象,一个Class对象。
Class stuClass = stu1.getClass();//获取Class对象
System.out.println(stuClass.getName());
//第二种方式获取Class对象
Class stuClass2 = Student.class;
System.out.println(stuClass == stuClass2);//判断第一种方式获取的Class对象和第二种方式获取的是否是同一个
//第三种方式获取Class对象
try {
Class stuClass3 = Class.forName("fanshe.Student");//注意此字符串必须是真实路径,就是带包名的类路径,包名.类名
System.out.println(stuClass3 == stuClass2);//判断三种方式是否获取的是同一个Class对象
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
三、解剖类
我们知道一个类里一般有构造函数、方法、成员变量(字段/属性)这三部分组成
翻阅API文档,可以看到
Class对象提供了如下常用方法:
public Constructor getConstructor(Class<?>…parameterTypes)
public Method getMethod(String name,Class<?>… parameterTypes)
public Field getField(String name)
public Constructor getDeclaredConstructor(Class<?>…parameterTypes)
public Method getDeclaredMethod(String name,Class<?>… parameterTypes)
public Field getDeclaredField(String name)
这些方法分别用于从类中解剖出构造函数、方法和成员变量(属性)。
解剖出的成员分别使用Constructor、Method、Field对象表示。
看完上边有关反射的东西, 对常用框架里的配置文件是不是有点思路了
与spring的关系
上边是Spring配置文件里的常见的bean配置,这看起来是不是可以用反射很轻易的就可以实现:解析xml然后把xml里的内容作为参数,利用反射创建对象。
除了这个,常用的框架里还有很多地方都用到了反射,反射是框架的灵魂,具备反射知识和思想,是看懂框架的基础
平常用到的框架,除了配置文件的形式,现在很多都使用了注解的形式,其实注解也和反射息息相关,使用反射也能轻而易举的拿到类、字段、方法上的注解,然后编写注解解析器对这些注解进行解析,做一些相关的处理,所以说不管是配置文件还是注解的形式,它们都和反射有关
四、参考博客
Java中的反射机制介绍
https://blog.csdn.net/ju_362204801/article/details/90578678
Java中反射机制详解
https://www.cnblogs.com/whgk/p/6122036.html
来源:CSDN
作者:mjx715813
链接:https://blog.csdn.net/mjx715813/article/details/103652817