JVM到底怎么进行类加载器的呢?
2017-08-14 10:42
417 查看
题目:Java的类加载器有哪些;每个类加载器都加载哪些类;这些类加载之间的父子关系是怎样的;什么是双亲委派模型;Java的类加载器为什么要使用双亲委派模型;如何自定义自己的类加载器,自己的类加载器和Java自带的类加载器关系如何处理?
这个题目主要考查ClassLoader的工作机制,即它是怎么把Class加载到JVM中?考查这个题目便于我们在日常的工作中更好的理解Java程序的工作原理。
BootstrapClassLoader(启动类加载器):主要加载JVM自身工作需要的类,完全由JVM自己控制;它是所有类加载器的父加载器,位于jre/lib/rt.jar。
ExtClassLoader(扩展类加载器):它既装载除了基本的Java API以外的扩展类,也负责装载其他的安全扩展功能;位于System.getProperty("java.ext.dirs")指向的目录。
AppClassLoader(系统类加载器):负责加载用户在$CLASSPATH里指定的类,位于System.getProperty("java.class.path")。
User-defined ClassLoader(用户自定义类加载器):直接用代码实现的类加载器,如:WebappClassLoader。
它们使用双亲委派的模型来加载;基于三个机制:委托、可见性和单一性。
委托:当一个类加载和初始化的时候,类仅在有需要加载的时候被加载。首先加载这个类的请求由AppClassLoader委托给它的父类加载器ExtClassLoader,然后再委托给BootstrapClassLoader。BootstrapClassLoader会先看看rt.jar中有没有这个类,如果并没有这个类,就把这个请求返回到ExtClassLoader,它会查看jre/lib/ext目录下有没有这个类,如果这个类被ExtClassLoader找到了,那么它将被加载,而AppClassLoader不会加载这个类;而如果这个类没有被ExtClassLoader找到,那么再由AppClassLoader从classpath中寻找。
可见性:子类加载器可以看到父类加载器加载的类,而反之则不行。
单一性:父加载器加载过的类不能被子加载器加载第二次。
隐式加载:不通过调用ClassLoader来加载需要的类,而是通过JVM自动加载所需的类到内存。如,继承与类引用。
显示加载:通过ClassLoader类来加载类的方式。如,this.getClass().getClassLoader().loadClass()/Class.forName()/自定义的类加载器的findClass()。
自己定义的类加载器一般继承ClassLoader/URLClassLoader。
一般只需要重写findClass()方法;同一个类如果被两个类加载器加载,那么JVM不认为使相同的类;检查被请求的类是否已经被加载到命名空间,如果已被加载,则直接返回。
用到的代码:
执行结果:
分析一下常见类加载错误有那些,是怎么产生的?
记住,这里全部都是干货!!!
考点
这个题目主要考查ClassLoader的工作机制,即它是怎么把Class加载到JVM中?考查这个题目便于我们在日常的工作中更好的理解Java程序的工作原理。
类加载器有那些?
BootstrapClassLoader ExtClassLoader AppClassLoader URLClassLoader WebappClassLoader
每个类加载器加载了那些类?
BootstrapClassLoader(启动类加载器):主要加载JVM自身工作需要的类,完全由JVM自己控制;它是所有类加载器的父加载器,位于jre/lib/rt.jar。ExtClassLoader(扩展类加载器):它既装载除了基本的Java API以外的扩展类,也负责装载其他的安全扩展功能;位于System.getProperty("java.ext.dirs")指向的目录。
AppClassLoader(系统类加载器):负责加载用户在$CLASSPATH里指定的类,位于System.getProperty("java.class.path")。
User-defined ClassLoader(用户自定义类加载器):直接用代码实现的类加载器,如:WebappClassLoader。
类是怎么加载的,为什么要使用双亲委派模型?
它们使用双亲委派的模型来加载;基于三个机制:委托、可见性和单一性。委托:当一个类加载和初始化的时候,类仅在有需要加载的时候被加载。首先加载这个类的请求由AppClassLoader委托给它的父类加载器ExtClassLoader,然后再委托给BootstrapClassLoader。BootstrapClassLoader会先看看rt.jar中有没有这个类,如果并没有这个类,就把这个请求返回到ExtClassLoader,它会查看jre/lib/ext目录下有没有这个类,如果这个类被ExtClassLoader找到了,那么它将被加载,而AppClassLoader不会加载这个类;而如果这个类没有被ExtClassLoader找到,那么再由AppClassLoader从classpath中寻找。
可见性:子类加载器可以看到父类加载器加载的类,而反之则不行。
单一性:父加载器加载过的类不能被子加载器加载第二次。
JVM怎么加载Class文件到内存?
隐式加载:不通过调用ClassLoader来加载需要的类,而是通过JVM自动加载所需的类到内存。如,继承与类引用。显示加载:通过ClassLoader类来加载类的方式。如,this.getClass().getClassLoader().loadClass()/Class.forName()/自定义的类加载器的findClass()。
如何自定义类加载器,及怎么处理加载器关系?
自己定义的类加载器一般继承ClassLoader/URLClassLoader。一般只需要重写findClass()方法;同一个类如果被两个类加载器加载,那么JVM不认为使相同的类;检查被请求的类是否已经被加载到命名空间,如果已被加载,则直接返回。
用到的代码:
private void hi(HttpServletRequest request, HttpServletResponse response) throws IOException { ClassLoader classLoader = HelloServlet.class.getClassLoader(); while (classLoader != null) { response.getWriter().write(classLoader.getClass().getCanonicalName()+"\n"); classLoader = classLoader.getParent(); } }
执行结果:
org.apache.catalina.loader.WebappClassLoader java.net.URLClassLoader sun.misc.Launcher.AppClassLoader sun.misc.Launcher.ExtClassLoader
分析一下常见类加载错误有那些,是怎么产生的?
ClassNotFoundException NoClassDefFoundError UnsatisfiedLinkError ClassCastException ExceptionInInitializerError
记住,这里全部都是干货!!!
相关文章推荐
- 安卓 listview 中异步加载图片乱序到底该怎么解决
- XSD版本到底怎么选择正确的进行配置
- 目前大家对Python都有一个共识,就是他对测试非常有用,自动化测试里Python用途也很广,但是Python到底怎么进行自动化测试呢?今天就简单的向大家介绍一下怎么使用Python进行自动化测试
- Class.forName(String name)方法,到底会触发那个类加载器进行类加载行为?
- ImageView怎么从pist文件中加载png图片,并对ImageView进行监听
- [jvm解析系列][九]类的加载过程和类的初始化。你的类该怎么执行?为什么需要ClassLoader?
- iOS中的单例到底怎么写?
- 怎么用MindManager进行项目管理
- Xcode升级导致插件无法使用和点击skip bundle后怎么重新加载插件
- 使用Git进行本地提交后,未上传提交,却不小心删除了本地提交或提交所在分支,怎么办?????
- CAD编辑器的语言可以进行中英文切换吗?要怎么来操作呀?
- 将节能进行到底:Facebook为冷存储寻求廉价闪存
- 资深HR告诉你到底怎么写一份好的简历(非常全面)
- 在虚拟机vmware下怎么让Linux加载u盘
- SQL到底该怎么发音: S-Q-L or Sequel?
- 怎么在CAD看图中同时打开两张CAD图纸进行查看?
- hibernate怎么连接数据库并进行操作[读取][存放]
- OpenCV进行图形匹配的方法,如若原图图中没有欲找的图,怎么设置返回错误..
- JVM-类加载
- How to load a dll resource dialog box at an application Dialog box (怎么在一个应用程序对话框动态加载DLL里的资源对话框)