Java常用获取类加载器的三种方式和区别

一、获取类加载器的三种方式

//获取当前类的加载器
ClassLoader classLoader = Test.class.getClassLoader();
//获取当前线程上下文类加载器
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
//获取系统类加载器
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();

二、3种方式的区别

  1. **getClassLoader()**是获取加载当前类的类加载器,可能是"启动类加载器"、“拓展类加载器”、"系统类加载器"等,取决于当前类是由哪个加载器加载的;

    //输出null,代表启动类加载器
    String.class.getClassLoader();
    
    //java se环境下输出:AppClassLoader---系统类加载器
    //java ee + tomcate 环境下输出:WebappClassLoader---自定义类加载器,是系统类加载器的子加载器
    UnionWxMaComponent.class.getClassLoader();
    
  2. **getContextClassLoader()**是获取当前线程上下文的类加载器,用户可以自己设置,java se环境下一般是AppClassLoaderjava ee环境下一般是WebappClassLoader

    //java se环境下输出:AppClassLoader---系统类加载器
    //java ee + tomcate 环境下输出:WebappClassLoader---自定义类加载器,是系统类加载器的子加载器
    Thread.currentThread().getContextClassLoader();
    
    //获取到扩展类加载器,并设置到线程上下文中,再获取线程上下文类加载器就是扩展类加载器了
    ClassLoader classLoader = ClassLoader.getSystemClassLoader().getParent();
    Thread.currentThread().setContextClassLoader(classLoader);
    
  3. **getSystemClassLoader()**是获取系统类加载器—AppClassLoader

    //输出AppClassLoader---系统类加载器
    ClassLoader.getSystemClassLoader();
    

你可能感兴趣的:(java)