zoukankan      html  css  js  c++  java
  • JVM 类加载器的双亲委托机制

    1、类加载器的层次结构

    在双亲委托机制中,各个加载器按照父子关系形成了树形结构(逻辑意义),除了根加载器之外,其余的类加载器都有且只有一个父加载器。

    public class MyTest13 {
    
        public static void main(String[] args) {
            ClassLoader classLoader = ClassLoader.getSystemClassLoader();
            System.out.println(classLoader);
    
            while (null !=  classLoader){
                classLoader = classLoader.getParent();
                System.out.println(classLoader);
            }
        }
    }
    

      打印结果

    sun.misc.Launcher$AppClassLoader@18b4aac2
    sun.misc.Launcher$ExtClassLoader@1540e19d
    null
    

      null说明classLoader是启动类加载器

    2、类加载器的双亲委托机制

     3、返回String类的ClassLoader

    public class MyTest7 {
        public static void main(String[] args)  throws  Exception{
            Class<?> clazz = Class.forName("java.lang.String");
            ClassLoader classLoader = clazz.getClassLoader();
            System.out.println(classLoader);
        }
    
    }
    

      返回结果

    null
    

      null说明classLoader是启动类加载器

    4、返回自定义类的ClassLoader

    public class MyTest7 {
        public static void main(String[] args)  throws  Exception{
          
            Class<?> clazz2 = Class.forName("com.example.jvm.classloader.C");
            ClassLoader classLoader2 = clazz2.getClassLoader();
            System.out.println(classLoader2);
        }
    
    }
    
    class C{
    
    }
    

      返回结果

    sun.misc.Launcher$AppClassLoader@18b4aac2
    

     

    5、获得class文件的路径

    public class MyTest14 {
    
        public static void main(String[] args) throws IOException{
            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
            System.out.println(classLoader);
            String resourceName = "com/example/jvm/classloader/MyTest13.class";
    
            Enumeration<URL> urls =  classLoader.getResources(resourceName);
            while (urls.hasMoreElements()){
                URL url = urls.nextElement();
                System.out.println(url);
            }
        }
    }
    

      打印结果:

    sun.misc.Launcher$AppClassLoader@18b4aac2
    file:/D:/workspace/study/%20jvm_demo/build/classes/java/main/com/example/jvm/classloader/MyTest13.class
    

      

     6、获得ClassLoader的途径

    获得当前类的ClassLoader

    clazz.getClassLoader();

    获得当前线程的上下文ClassLoader

    Thread.currentThread().getContextClassLoader()

    获得系统的ClassLoader

    ClassLoader.getSystemClassLoader();

    获得调用者的ClassLoader

    DriverManager.getCallerClassLoader()

  • 相关阅读:
    HIVE Group by、join、distinct等实现原理
    【1.3】shell基础——调试shell(sh -x)
    sql server无法显示请求的对话框,检索数据失败
    sql server索引操作
    sql server中的alter
    tempdb无法收缩。使用 DBCC FREESYSTEMCACHE 解决
    在从该备份集进行读取时,RESTORE 检测到在数据库 "CISDB" 中的页(0:0)上存在错误。系统断定检查已失败
    【1.2】shell基础——stty erase解决按backspace出现^H的情况
    【1.1】shell基本实践——密码输入三次错误则结束
    (5.3.7)数据库迁移——sql server备份文件的加密解密
  • 原文地址:https://www.cnblogs.com/linlf03/p/10991374.html
Copyright © 2011-2022 走看看