Java-类加载器【待完成】

  类是在运行期间第一次使用时动态加载的,而不是一次性加载所有类。因为如果一次性加载,那么会占用很多的内存。【感觉和单例模式中的懒汉单例有异曲同工之妙】

1,类的生命周期【7 个阶段】

2,类加载过程

  包含了加载、验证、准备、解析和初始化这 5 个阶段

2.1 加载【读取二进制字节流】

加载是类加载的一个阶段,注意不要混淆。

加载过程完成以下三件事:

  ①通过类的完全限定名称获取定义该类的二进制字节流

  ②将该字节流表示的静态存储结构转换为方法区的运行时存储结构

  ③在内存中生成一个代表该类的 Class 对象,作为方法区中该类各种数据的访问入口

其中二进制字节流可以从以下方式中获取:

  ①从 ZIP 包读取,成为 JAR、EAR、WAR 格式的基础。

  ②从网络中获取,最典型的应用是 Applet。

  ③运行时计算生成,例如动态代理技术,在 java.lang.reflect.Proxy 使用 ProxyGenerator.generateProxyClass 的代理类的二进制字节流。

  ④由其他文件生成,例如由 JSP 文件生成对应的 Class 类。

2.2 验证【验证是否适用】

  确保 Class 文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。

2.3 准备

  类变量是被 static 修饰的变量,准备阶段为类变量分配内存并设置初始值,使用的是方法区的内存。

  实例变量不会在这阶段分配内存,它会在对象实例化时随着对象一起被分配在堆中。应该注意到,实例化不是类加载的一个过程,类加载发生在所有实例化操作之前,并且类加载只进行一次,实例化可以进行多次。

  初始值一般为 0 值,例如下面的类变量 value 被初始化为 0 而不是 123。

public static int value = 123;

  如果类变量是常量,那么它将初始化为表达式所定义的值而不是 0。例如下面的常量 value 被初始化为 123 而不是 0。

public static final int value = 123;

3,类初始化时机

4,类与类加载器

5,类加载器分类

6,双亲委派模型

7,自定义类加载器实现

猜你喜欢

转载自www.cnblogs.com/Mufasa/p/11460257.html