三分钟理解ClassLoader类加载机制

注:本文管死不管埋,如不理解的相关部分请再自行百度

何为ClassLoader?

ClassLoader的具体作用就是将class文件加载到jvm虚拟机中去,jvm启动的时候,并不会一次性加载所有的class文件,而是根据需要去动态加载。

类加载流程

JVM自带三个类加载器:

  • Bootstrap ClassLoader 最顶层的加载类,主要加载核心类库,%JRE_HOME%\lib下的rt.jar、resources.jar、charsets.jar和class等。另外需要注意的是可以通过启动jvm时指定-Xbootclasspath和路径来改变Bootstrap ClassLoader的加载目录。比如java -Xbootclasspath/a:path被指定的文件追加到默认的bootstrap路径中。
  • Extention ClassLoader 扩展的类加载器,加载目录%JRE_HOME%\lib\ext目录下的jar包和class文件。还可以加载-D java.ext.dirs选项指定的目录。
  • Appclass Loader也称为SystemAppClass 加载当前应用的classpath的所有类。

简要解释:

  • Bootstrap ClassLoader负责加载JAVA_HOME/lib下的核心jar包
  • Extention ClassLoader负责加载JAVA_HOME/lib/ext下的jar包也称扩展包
  • Appclass Loader负责加载当前项目下的classpath所有类

加载流程(双亲委派)

三分钟理解ClassLoader类加载机制_第1张图片
(盗图不会揍我吧,哈哈)

自定义ClassLoader

  • 继承ClassLoader
  • 重写findClass方法
@Override
    protected Class findClass(String name) throws ClassNotFoundException {
        String fileName = getFileName(name);
        File file = new File(mLibPath, fileName);
        try {
            FileInputStream is = new FileInputStream(file);
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            int len = 0;
            try {
                while ((len = is.read()) != -1) {
                    bos.write(len);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            byte[] data = bos.toByteArray();
            is.close();
            bos.close();
            /*要点:读取的class文件流,要调研此方法生成class对象*/
            return defineClass(name, data, 0, data.length);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return super.findClass(name);
    }

使用场景

  • 热部署
  • 代码保护
  • 加解密
  • 包隔离(包冲突解决方案)
  • 其它请自行脑补^_^

引用

参考以下资料
- http://blog.csdn.net/briblue/article/details/54973413
- http://blog.csdn.net/irelandken/article/details/7048817
- http://blog.csdn.net/xyang81/article/details/7292380

你可能感兴趣的:(java技术)