1、类加载器

java字节码(类)的加载是由虚拟机来完成的,虚拟机把描述类的Class文件加载到内存,并对数据进行校验、解析和初始化,最终形成能被java虚拟机直接使用的java类型,这就是虚拟机的类加载机制。

JVM中用来完成上述功能的具体实现就是类加载器,类加载器读取.class字节码文件将其转换成java.lang.Class类的一个实例。每个实例表示一个java类。通过该实例的newInstance()方法可以创建出一个该类的对象。

2、Class.getResourceAsStream()

Class.getResourceAsStream() 会指定要加载的资源路径与当前类所在包的路径一致。

例如你写了一个MyClass类在包com.qike.demo下,那么MyClass.class.getResourceAsStream(“name”) 会在com.qike.demo包下查找相应的资源。

如果这个name是以 ‘/’ 开头的,那么就会从classpath的根路径下开始查找。

ClassLoader.getResourceAsStream()

无论要查找的资源前面是否带’/’ClassLoader.getResourceAsStream() 都会从classpath的根路径下查找。

MyClass.getClassLoader().getResourceAsStream(“name”) 和 MyClass.getClassLoader().getResourceAsStream(“name”) 的效果是一样的。

3、类加载器的划分

有3种系统提供的类加载器:

启动类加载器(Bootstrap ClassLoader):

这个类加载器负责将\lib目录下的类库加载到虚拟机内存中,用来加载java的核心库,此类加载器并不继承于java.lang.ClassLoader,不能被java程序直接调用,代码是使用C++编写的.是虚拟机自身的一部分.

扩展类加载器(Extendsion ClassLoader):

这个类加载器负责加载\lib\ext目录下的类库,用来加载java的扩展库,开发者可以直接使用这个类加载器.

应用程序类加载器(Application ClassLoader):

这个类加载器负责加载用户类路径(CLASSPATH)下的类库,一般我们编写的java类都是由这个类加载器加载,这个类加载器是CLassLoader中的getSystemClassLoader()方法的返回值,所以也称为系统类加载器.一般情况下这就是系统默认的类加载器.

除此之外,我们还可以加入自己定义的类加载器,以满足特殊的需求,需要继承java.lang.ClassLoader类.

05-28 06:27