设为首页 加入收藏

TOP

Java 类加载的一些理解(一)
2017-04-07 10:26:13 】 浏览:665
Tags:Java 加载 一些 理解

首先类加载过程的确是使用双亲委托方式,就是先找parent的classLoader加载,Java有几个固定的classLoader:1、BootstrapClassLoader 2、ExtClassLoader 3、AppClassLoader 这里有篇文章,也讲些了这些classLoader的关系 加载器。


但是网上很多文章说这几个加载器是有继承关系,然后我看到代码它们是没有继承关系的,但是它们都有个getParent()方法去获取所谓的父加载器,其实这个值的设置就要看Launcher的代码


public class Launcher {
 private static URLStreamHandlerFactory factory = new Factory();
 private static Launcher launcher = new Launcher();


 public static Launcher getLauncher() {
  return launcher;
 }


 private ClassLoader loader;


 // ClassLoader.getSystemClassLoader会调用此方法
 public ClassLoader getClassLoader() {
  return loader;
 }


 public Launcher() {
  // 1. 创建ExtClassLoader
  ClassLoader extcl;
  try {
   extcl = ExtClassLoader.getExtClassLoader();
  } catch (IOException e) {
   throw new InternalError("Could not create extension class loader");
  }


  // 2. 用ExtClassLoader作为parent去创建AppClassLoader
  try {
   loader = AppClassLoader.getAppClassLoader(extcl);
  } catch (IOException e) {
   throw new InternalError("Could not create application class loader");
  }


  // 3. 设置AppClassLoader为ContextClassLoader
  Thread.currentThread().setContextClassLoader(loader);
  // ...
 }


 static class ExtClassLoader extends URLClassLoader {
  private File[] dirs;


  public static ExtClassLoader getExtClassLoader() throws IOException {
   final File[] dirs = getExtDirs();
   return new ExtClassLoader(dirs);
  }


  public ExtClassLoader(File[] dirs) throws IOException {
   super(getExtURLs(dirs), null, factory);
   this.dirs = dirs;
  }


  private static File[] getExtDirs() {
   String s = System.getProperty("java.ext.dirs");
   File[] dirs;
   // ...
   return dirs;
  }
 }


 /**
  * The class loader used for loading from java.class.path. runs in a
  * restricted security context.
  */
 static class AppClassLoader extends URLClassLoader {


  public static ClassLoader getAppClassLoader(final ClassLoader extcl) throws IOException {
   final String s = System.getProperty("java.class.path");
   final File[] path = (s == null) ? new File[0] : getClassPath(s);


   URL[] urls = (s == null) ? new URL[0] : pathToURLs(path);
   return new AppClassLoader(urls, extcl);
  }


  AppClassLoader(URL[] urls, ClassLoader parent) {
   super(urls, parent, factory);
  }


  /**
  * Override loadClass so we can checkPackageAccess.
  * 这个方法似乎没什么必要,因为super.loadClass(name, resolve)时也会checkPackageAccess
  */
  public synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
   int i = name.lastIndexOf('.');
   if (i != -1) {
    SecurityManager sm = System.getSecurityManager();
    if (sm != null) {
     //
     sm.checkPackageAccess(name.substring(0, i));
    }
   }
   return (super.loadClass(name, resolve));
  }


 }
}


1.Launcher源码里定义了static的扩展类加载器ExtClassLoader, static的系统类加载器AppClassLoader。


2.它们都是默认包级别的,它们都是继承URLClas

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 1/8/8
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Spring Boot 常用注解 下一篇Java 内存模型简单理解

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目