20191226-反射学习
2019/12/26-反射
1.类的加载
当程序要使用某个类时,如果该类还未被记载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类的初始化。
a.加载
就是指将class文件读入内存,并为之创建一个Class对象。
任何类被使用时系统都会创建一个Class对象。
b.连接
验证 是否有正确的内部结构,并和其他类协调一致
准备 负责为类的静态成员分配内存,并设置默认初始化值(静态随着类的加载而加载 )
解析 将类的二进制数据中的符号引用替换为直接引用(地址值)
c.初始化
为栈开辟空间等
2.类的实例
a.创建类的实例时(Person p= new Person())
b.访问类的静态变量,或者为静态变量赋值
c.调用类的静态方法
d.使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
e.初始化某个类的子类(会优先加载父类,因为子类可能会使用父类中的一些东西)
f.直接使用java.exe命令来运行某个主类
2.类加载器
a.负责将.class文件加载到内存中,并为之生成对应的Class对象。
b.虽然我们不需要关心类加载机制,但是了解这个机制我们就能更好的理解程序的运行。
c.类加载器的组成
Bootstrap ClassLoader根类加载器
Extension ClassLoader扩展类加载器
System ClassLoader系统类加载器
3.类加载器的作用
rt.jar的位置
解压后的rt.jar的内容
rt/java中的其他经常使用的包
Object.class文件
反编译后得到的object.java文件
我们注意到notify(),notifyAll(),wait()等全都被native(本地的)修饰,即不是我们手动做的,是系统本地做的,与系统进程相关,而Java做线程是依靠系统底层的。
所以我们可以获得很多个.class文件,如何使用.class文件?Java提供了反射技术
4.反射
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class(首字母大写)类中的方法,所以先要获取到每一个字节码文件对应的Class类型的对象。
Java/lang/Class.class文件
也可以使用反编译软件将其反编译得到Class.java文件,过程感觉很奇妙。