Java之反射机制

反射机制:

  反射是java中框架的灵魂,通过反射可以在程序中通过字节码文件调用对象.我个人认为反射的最大作用就是可以在程序之外进行某些类的配置以及更改.

如果要理解反射,首先要知道代码运行的三个阶段.

Source源代码阶段
会生成.class文件
获取对应类的class对象Class.forName("全类名")
将Java文件保存到本地硬盘
字节码文件在内存中使用Class类表示
Class类对象阶段
jvm虚拟机,会调用类加载器,将class文件加载进内存中
获取对应类的class对象,类名.class
编译Java文件,生成.class文件
使用反射的时候,首先获取到Class类,就可以得到class文件里的所有内容,包含属性、构造方法、普通方法
Runtime运行时阶段
懒加载机制,真正new对象时,会先去内存中寻找是否有该对象对应的class文件,若存在在使用该对象创建一个该class对象的实例,若不存在,则会调用加载器先加载该对象的class文件,并将其各个部分封装成各个部分对应的对象.
获取对应类的class对象,对象.getClass()
使用Java虚拟机(JVM)将字节码文件加载到内存
反射自理解: 我们正常的创建对象调用方法是通过 类创建对象然后调用方法,反射是通过java提供的api先获取到需要调用方法的类的模板,然后通过该类得到该类模板进行创建对象,然后再通过对象调用方法
反射的本质是,由 源代码-> Class类对象->类对象实例->调用方法或者属性
反射的实现
1源代码阶段:假设有一个类的源代码
2Class类对象阶段:通过java提供的API得到类的对象
Class.forName
3类对象实例:通过java提供的api得到类对象的实例
Class类对象调用Consturts
4通过类对象的实例,此时的实例因为不知道是读取的是什么类型的类,所以只能通过类得到方法的对象,再调用java提供的api进行执行.
getField得到属性
属性有get和set方法,属性.setAccessible(true);,可以对属性进行暴力破解,进行赋值,在反射中没有什么是隐私的.
getMethord
方法,调用invoke方法

正常:是通过类去操作字节码文件
反射的本质是通过字节码文件操控对象
new对象时判断该类对应class对象是否存在

原文地址:https://www.cnblogs.com/qmk-716/p/11725303.html