首先知道我们写的.Java源码文件,经过javac.exe编译后成为了.class文件,.class文件中描述了类的各种信息,最终都需要加载到虚拟机之后才能运行和使用。而虚拟机如何加载这些.class文件?.class文件的信息进入到虚拟机后会发生什么变化?下面我们就来了解一下java类加载的过程:
我们写的类,首先会编译成字节码文件,然后通过Java 中的类加载器负责将我们需要使用的类,加载进内存。而类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的。
当然jvm启动的时候,并不是一次性加载所有的类,而是根据需要动态去加载类,主要分为隐式加载和显示加载。
隐式加载:程序代码中不通过调用ClassLoader来加载需要的类,而是通过JVM类自动加载需要的类到内存中。例如,当我们在类中继承或者引用某个类的时候,JVM在解析当前这个类的时,发现引用的类不在内存中,那么就会自动将这些类加载到内存中。
显示加载:代码中通过Class.forName(),this.getClass.getClassLoader.LoadClass(),自定义类加载器中的findClass()方法等。
-
引导类加载器(bootstrap class loader):
它用来加载 Java 的核心库(jre/lib/rt.jar),是用原生C/C++代码来实现的,并不继承自java.lang.ClassLoader。加载扩展类和应用程序类加载器,并指定他们的父类加载器,因为不是java编写,所以在java中并无法展现,也获取不到。 但是我们可以通过简单代码来查看它所负责加载类的路径:
package test;
public class Test01{
public static voidmain(String[]args){
System.out.println(System.getProperty(“sun.boot.class.path”));
}
}
打印结果如下:
D:\ develop\Java\jdk1.8.0_20\jre\lib\resources.jar;D:\Program
Files\Java\jdk1.8.0_20\jre\lib\rt.jar;D:\Program
Files\Java\jdk1.8.0_20\jre\lib\sunrsasign.jar;D:\Program
Files\Java\jdk1.8.0_20\jre\lib\jsse.jar;D:\Program
Files\Java\jdk1.8.0_20\jre\lib\jce.jar;D:\Program
Files\Java\jdk1.8.0_20\jre\lib\charsets.jar;D:\Program
Files\Java\jdk1.8.0_20\jre\lib\jfr.jar;D:\Program