类加载器

Posted scmath

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类加载器相关的知识,希望对你有一定的参考价值。

参考:https://blog.csdn.net/iteye_5504/article/details/82584210

类加载器的分类:
1、启动类加载器(Bootstrap ClassLoader) 这个类有c++语言实现,是虚拟机的一部分。
2、所有其他类加载器。其他类加载器都继承抽象类java.lang.ClassLoader。


做为java的大部分项目,都是有以下三类类加载器加载的:
1、启动类加载器。加载的内容为:jre/lib 目录中的jar包。(JRE/lib的 所有jar包的.class文件,例如java.lang.System.class等)虚拟机启动首先加载类
2、扩展类加载器。加载的内容为:java.ext.dirs 系统变量指定的路径中所有类库。实现为:sun.misc.Launcher$ExtClassLoader 实现。
3、应用类加载器。实现为:sun.misc.Launcher$AppClassLoader。负责加载用户类路径上指定的类库。

 1 package test;
 2 
 3 import java.lang.System;    //BootstrapClassLoader    ./jre/lib/*.jar
 4 import sun.awt.HKSCS;       //BootstrapClassLoader    ./jre/lib/*.jar  
 5 import sun.net.spi.nameservice.dns.DNSNameService;    //ExtClassLoader   ./jre/ext/
 6 import org.apache.commons.lang.StringUtils;    //AppClassLoader
 7 
 8 public class Test {
 9     public static void main(String[] args) {
10        System.out.println(Thread.currentThread().getContextClassLoader());
11        System.out.println(StringUtils.class.getClassLoader());
12 
13        System.out.println(StringUtils.class.getResource("/"));
14        System.out.println(Test.class.getResource("/"));
15 
16        System.out.println(StringUtils.class.getResourceAsStream("/jdbc.xml"));
17        System.out.println(Test.class.getResourceAsStream("/jdbc.xml"));
18     }
19 }

 

未考虑ExtClassLoader

  • 执行javac Test.java

    3.4行编译通过: 说明jre/lib文件夹里的class文件能被虚拟机加载,(Bootstrap ClassLoader)

    第5行出错,找不到程序包:因为Bootstrap ClassLoader,AppClassLoader也未找到。(AppClassLoader 的根目录在执行环境的目录。)

  • 添加StringUtils.class
       在Test.java同目录添加import的.class文件,执行javac Test.java,编译通过。证明StringUtils.class能被AppClassLoader加载(注意包名和路径的对应)

 










以上是关于类加载器的主要内容,如果未能解决你的问题,请参考以下文章

活动(加载器 - 下载)+ 3 个片段(使用加载器 - 计算)

损坏的顶点和片段着色器

Honeycomb 中的片段加载微调器/对话框

用于在多个活动/片段中重用的全局加载器 (LoaderManager)

Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段

Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段