反射
1. 什么是反射
反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性
反射能做什么
- 分析类
加载并初始化类
查看类的所有方法和属性 - 查看并使用对象
查看一个类的所有属性和方法
使用对象的任意方法和属性
2. 获取字节码文件的三种方式
类加载器(ClassLoader)
负责将类的字节码文件(.class文件)加载到内存中,并生成对应的Class对象。
Class对象
字节码文件对象,每个Class对象对应一个字节码文件。
一个*.java源文件对应一个*.class字节码文件对应一个Class对象
类的加载时机
1. 创建类的实例
Student s = new Student();
2. 访问类的静态成员
Calender.getInstance();
3. 初始化类的子类
class User extend Person{}
User u = new User(); //先加载父类
4. 通过反射的方式创建Class对象
Class clazz = Class.forName("类的全限定名");
总结
当你第一次使用类的成员时,类加载器就会将该类的字节码加载到内存中。
获取Class对象的三种方式
1. Object的getClass()方法
Class clazz = 对象名.getClass();
2. 类的静态属性
Class clazz = 类名.class;
3. Class类的静态方法
Class clazz = Class.forName("类的全限定名");
3. 通过反射的方式获取构造方法并使用
4. 通过反射的方式获取成员方法并使用
5. 通过反射的方式获取成员变量并使用
6. 面试题
6.1 Java反射机制的作用
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类所具有的成员变量和方法
- 在运行时调用任意一个对象的成员变量和方法
6.2 哪里用到了反射
- JDBC中,利用反射动态加载了数据库驱动程序。
- 加载src下的配置文件
- Eclispe,Idea等开发工具利用反射动态刨析对象的类型与结构,动态提示对象的属性和方法
6.3 反射的优缺点
优点:可以动态执行,在运行期间根据业务功能动态执行方法、访问属性,最大限度发挥了java的灵活性。
缺点:对性能有影响,这类操作总是慢于直接执行java代码。
7. 反射的总体流程
当我们编写完一个Java项目之后,每个java文件都会被编译成一个.class文件。
这些class文件在程序运行时会被ClassLoader加载到JVM中,当一个类被加载以后,JVM就会在内存中自动产生一个Class对象。
通过Class对象获取Field/Method/Construcor
我们一般平时是通过new的形式创建对象实际上就是通过这些Class来创建的,只不过这个class文件是编译的时候就生成的,程序相当于写死了给jvm去跑。
反射是什么呢?当我们的程序在运行时,需要动态的加载一些类,这些类可能之前用不到,所以没有加载到jvm,而是在运行时根据需要才加载。
原来使用new的时候,需要明确的指定类名,这个时候属于硬编码实现,而在使用反射的时候,可以只传入类名参数,就可以生成对象,降低了耦合性,使得程序更具灵活性。
8. 反射的应用场景
9. 类加载器的作用与双亲委派机制
10. 反射原理
首先我们需要了解java程序运行的过程,该过程包含两个阶段编译期和运行期。首先java代码会通过jdk编译成.class字节码文件,程序运行的时候,jvm会去调用业务逻辑对应需要的的字节码文件,生成对应的Class对象,并调用其中的属性方法完成业务逻辑。
而java反射则是在运行期时,主动让jvm去加载某个.class文件生成Class对象,并调用其中的方法属性。
使用反射的一般步骤是获取Class对象;设置属性;最后调用newnstance()调用构造得到实例
视频来源:https://www.bilibili.com/video/BV1Wx411f7qN?p=184&spm_id_from=pageDriver&vd_source=b901ef0e9ed712b24882863596eab0ca
面试题来源:https://www.zhihu.com/search?type=content&q=%E5%8F%8D%E5%B0%84%E9%9D%A2%E8%AF%95%E9%A2%98
反射流程:https://baijiahao.baidu.com/s?id=1720435615570624015&wfr=spider&for=pc
反射原理:https://jingyan.baidu.com/article/a3761b2b79afed5577f9aa43.html