zoukankan      html  css  js  c++  java
  • JDK中ClassLoader的分类以及ClassLoader间的层次关系

    几个常见的ClassLoader:

    bootstrap  class  loader:

    最早启动的class  loader,一般使用C语言,汇编语言,或是c++写的,用操作系统本地语言写的。这个class  loader你动不了,也没有名字,打印出来是空值。

      1,负责先把其他的class loader   load进来,然后其他class  loader再load其他class

      2,load  jre最核心的类,最核心的rt.jar拿出来把里边的class load进来。

    extension  class  loader:

      扩展,负责JDK的一些扩展类,扩展类在jre/bin/ext包里。

    application class  loader:

      load我们自己定义的class。

    还有很多其他的class  loader:

    SecureClassLoader安全的classloader,抽象类。

    java.net的URLClassLoader继承自SecureClassLoader,会帮我们检查安全性,load从网上下载的类,如applet等。

    我们也可以自己写自己的classloader,检查他的安全性,如检查名字。

    代码:

    public class TestJDKClassLoader {
    
        public static void main(String[] args) {
            
            //最核心的classloader,管理着最核心的类。打印不出来名字
            System.out.println(String.class.getClassLoader());  //null
            //拿到自己定义的类的classloader--->AppClassLoader
            System.out.println(TestJDKClassLoader.class.getClassLoader().getClass().getName());
            //拿到系统的classloader,就是--->AppClassLoader
            System.out.println(ClassLoader.getSystemClassLoader().getClass().getName());
    
        }
    
    }

    运行结果:

    null
    sun.misc.Launcher$AppClassLoader
    sun.misc.Launcher$AppClassLoader

    ClassLoader之间的层次关系:

    这里说的是对象和对象的关系,不是类之间的关系,不是继承。如app  class loader有一个引用,叫parent,指向他的上一层的class loader。用ClassLoader的getParent()方法可以做到。

    ClassLoader c = TestJDKClassLoader.class.getClassLoader();
            while(c!=null){
                System.out.println(c.getClass().getName());
                c = c.getParent();
                
            }

    输出:

    sun.misc.Launcher$AppClassLoader
    sun.misc.Launcher$ExtClassLoader
  • 相关阅读:
    vector详解
    笔记
    积木大赛
    codevs 1086 栈(Catalan数)
    不要把球传我
    同余方程 (codevs1200)
    最小集合
    数的计算
    产生数
    逃跑的拉尔夫
  • 原文地址:https://www.cnblogs.com/lihaoyang/p/4851768.html
Copyright © 2011-2022 走看看