十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
Java类加载器的作用有哪些?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
创新互联建站主营平桥网站建设的网络公司,主营网站建设方案,App定制开发,平桥h5成都小程序开发搭建,平桥网站营销推广欢迎平桥等地区企业咨询Java的类加载器结构为下图所示
关于三层类加载器、双亲委派机制,本文不再板书,读者可自行百度。
那么在JDK的源码中,三层结构的具体实现是怎么样的呢?
Bootstrap ClassLoader(引导类加载器)
引导类加载器是由C++实现的,并非Java代码实现,所以在Java代码中是无法获取到该类加载器的。
一般大家都称类加载器分为四种(引导类、扩展类、系统类以及用户自定义的类加载器),但其实在JVM虚拟机规范中的支持两种类型的类加载器,分别为引导类加载器(Bootstrap ClassLoader)和自定义类加载器(User-Defined ClassLoader),所以扩展类和系统类也可以统称为自定义类加载器。
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); } }