欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

荐 优秀的程序员怎么能不知道类是何时被加载进虚拟机的

程序员文章站 2022-04-29 10:43:22
开始正文前,让我们先来了解一下什么是“类的动态加载机制”。当编写好一个java类并通过编译器编译成class文件后,该类就可以在JVM虚拟机中运行了。我们将,class文件被加载到虚拟机中的过程称为“类加载机制”。“动态加载”就是在程序运行的过程中将class文件加载到虚拟机中。我们都知道java可以做到运行时动态加载类,那你知道,编写好的类是什么时候加载到java虚拟机中的吗?下面就让我们就一起探讨一下,java类在什么情况下会被加载到JVM虚拟机中。首先让我们先将idea作出如下配置(我使用的....

开始正文前,让我们先来了解一下什么是“类的动态加载机制”。当编写好一个java类并通过编译器编译成class文件后,该类就可以在JVM虚拟机中运行了。我们将,class文件被加载到虚拟机中的过程称为“类加载机制”。“动态加载”就是在程序运行的过程中将class文件加载到虚拟机中。

我们都知道java可以做到运行时动态加载类,那你知道,编写好的类是什么时候加载到java虚拟机中的吗?

荐
                                                        优秀的程序员怎么能不知道类是何时被加载进虚拟机的

下面就让我们就一起探讨一下,java类在什么情况下会被加载到JVM虚拟机中

首先让我们先将idea作出如下配置(我使用的开发工具是idea,所以只介绍了idea的配置),从而方便我们观察类是何时被加载的。

操作步骤请按如下两图进行:

荐
                                                        优秀的程序员怎么能不知道类是何时被加载进虚拟机的
荐
                                                        优秀的程序员怎么能不知道类是何时被加载进虚拟机的
第一种情况:

当我们通过“new”关键字创建出一个对象实例时,会将该类加载到虚拟机中。

代码:

public class Test {

  public static void main(String[] args) {
    // 通过new关键字创建A类的实例。
    A a = new A();
  }
}

// A类
public class A {

}

类的加载情况:

荐
                                                        优秀的程序员怎么能不知道类是何时被加载进虚拟机的

第二种情况:

当我们访问一个类的静态方法或者静态属性时,会将该类加载至虚拟机中。

代码:

public class Test {

  public static void main(String[] args) {
    String name = A.name;
    B.show();
  }
}

// A类
public class A {
  public static String name = "小菜鸟";
}

// B类
public class B {
  public static void show (){
    System.out.println("调用类的静态方法导致类加载!");
  }
}

类的加载情况:

荐
                                                        优秀的程序员怎么能不知道类是何时被加载进虚拟机的

当初始化一个类的时候会初始化该类的静态代码块,如果这其中有引用到其它类,那么被引用的类也会进行加载。

代码:

public class Test {

  public static void main(String[] args) {
    A a = new A();
  }
}

// A类
class A {

  // 静态代码块
  static {
    B b = new B();
  }

}

// B类
class B {
}

类的加载情况:

荐
                                                        优秀的程序员怎么能不知道类是何时被加载进虚拟机的

第三种情况:

通过反射(使用Class.forName()方法),也会导致类加载。

代码:

public class Test {

  public static void main(String[] args) {
    try {
      Class<?> a = Class.forName("articlecode.classloading.A");
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    }
  }
}

// A类
class A {
}

类的加载情况:

荐
                                                        优秀的程序员怎么能不知道类是何时被加载进虚拟机的

第四种情况:

当加载子类时,会先加载它的父类。

代码:

public class Test {

  public static void main(String[] args) {
    A a = new A();
  }
}

// A类
class A extends B{
}

// B类
class B {
}

类的加载情况:

荐
                                                        优秀的程序员怎么能不知道类是何时被加载进虚拟机的

以上四种情况都会将类加载进虚拟机中。类的加载有且仅有“一次”,当一个类已经在虚拟机中存在了,就不会再进行重复加载了。

今天的分享就到这里了,如果感觉“菜鸟”写的文章还不错,记得点赞关注呦!你们的支持就是我坚持下去的动力。文章哪里写的有问题的也希望大家可以指出,我会虚心受教。
荐
                                                        优秀的程序员怎么能不知道类是何时被加载进虚拟机的

本文地址:https://blog.csdn.net/first_M/article/details/107286563