Java类加载器的作用有哪些-创新互联

Java类加载器的作用有哪些?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

创新互联建站主营平桥网站建设的网络公司,主营网站建设方案,App定制开发,平桥h5成都小程序开发搭建,平桥网站营销推广欢迎平桥等地区企业咨询

Java的类加载器结构为下图所示Java类加载器的作用有哪些

关于三层类加载器、双亲委派机制,本文不再板书,读者可自行百度。

那么在JDK的源码中,三层结构的具体实现是怎么样的呢?

Bootstrap ClassLoader(引导类加载器)

引导类加载器是由C++实现的,并非Java代码实现,所以在Java代码中是无法获取到该类加载器的。

一般大家都称类加载器分为四种(引导类、扩展类、系统类以及用户自定义的类加载器),但其实在JVM虚拟机规范中的支持两种类型的类加载器,分别为引导类加载器(Bootstrap ClassLoader)和自定义类加载器(User-Defined ClassLoader),所以扩展类和系统类也可以统称为自定义类加载器。

Java类加载器的作用有哪些

Extension ClassLoader(扩展类加载器)和Appclass Loader(系统类加载器)

扩展类加载器和系统类加载器都是由Java语言编写,具体实现为sum.misc.Launcher中的两个内部类ExtClassLoader和AppClassLoader实现,我们进入到LaunchLacher这个类中看看(这个类在oracle jdk是没有公开源码的,需要看具体源码的读者可以下载open jdk中查看具体源码,笔者这里就只是使用IDEA反编译后生成的代码进行解析):

首先是Laucncher的构造方法:

public Launcher() {
  Launcher.ExtClassLoader var1;
  try {
  	// 获取扩展类加载器
   var1 = Launcher.ExtClassLoader.getExtClassLoader(); 
  } catch (IOException var10) {
   throw new InternalError("Could not create extension class loader", var10);
  }

  try {
  	// 获取系统类加载器
   this.loader = Launcher.AppClassLoader.getAppClassLoader(var1); 
  } catch (IOException var9) {
   throw new InternalError("Could not create application class loader", var9);
  }
		// 此处是将系统类加载器设置为当前线程的上下文加载器
  Thread.currentThread().setContextClassLoader(this.loader); 
  String var2 = System.getProperty("java.security.manager");
  if (var2 != null) {
   SecurityManager var3 = null;
   if (!"".equals(var2) && !"default".equals(var2)) {
    try {
     var3 = (SecurityManager)this.loader.loadClass(var2).newInstance();
    } catch (IllegalAccessException var5) {
    } catch (InstantiationException var6) {
    } catch (ClassNotFoundException var7) {
    } catch (ClassCastException var8) {
    }
   } else {
    var3 = new SecurityManager();
   }

   if (var3 == null) {
    throw new InternalError("Could not create SecurityManager: " + var2);
   }

   System.setSecurityManager(var3);
  }

 }

本文标题:Java类加载器的作用有哪些-创新互联
分享地址:http://scyanting.com/article/cohjjj.html