Fork me on GitHub

类加载的过程

我们知道类加载过程有5个阶段,加载,验证,准备,解析和初始化。
在加载阶段,虚拟机要完成以下三件事:
1. 通过一个类的全限定名来获取定义此类的二进制字节流。
2. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
3. 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。
获取类的二进制字节流的方式有很多,不仅是从class文件中读取,而且可以是在运行时计算生成,这个应用的场景是动态代理,在java.lang.reflect.Proxy中,就是用了ProxyGenerator.generateProxyClass来为特定接口生成形式为“*$Proxy”的代理类的二进制字节流。还可以使其他文件生成,JSP文件生成对应的Class类。
开发人员可以自定义一个自己的类加载器去控制字节流的获取方式(即重写一个类加载器的loadClass()方法)。
数组类不是通过类加载创建,它是由虚拟机直接创建。
加载阶段后,虚拟机外部的二进制流就按照虚拟机所需的格式存储在方法区,然后在内存中实例化一个java.lang.Class类的对象,类的对象一般存在java堆中,对于Hotspot虚拟机Class对象较为特殊存在方法区中。这个对象将作为访问方法区中数据类型的接口。


最新评论

    还没有人评论...

当当

友情链接

Powered by Python. Copyright © 2017.

鄂ICP备17010875号. All rights reserved.