当前位置: 代码迷 >> J2SE >> 一个面试有关问题:java classloader里有一个什么模型
  详细解决方案

一个面试有关问题:java classloader里有一个什么模型

热度:84   发布时间:2016-04-23 19:42:55.0
一个面试问题:java classloader里有一个什么模型?
准确的来说,我不知道他想问什么。。。我回答是父亲委托?(准确描述应该是双亲委托好像,当时差不多知道面挂了,有点乱)。我答完面试官也不置可否,呵呵,最后我也不知道标准答案是啥啊。
------解决思路----------------------
你说的没错,就是双亲委派机制,我有自己总结过,你看下:
每个JAVA程序至少拥有三个类加载器
·引导类加载器 bootstrap
·扩展类加载器 ext
·系统类加载器(应用类加载器)app

引导类加载器负责加载系统类(rt.jar),是虚拟机不可分割的一部分,C实现的,没有对应的classloader
例如String.class.getClassLoader()返回null

扩展类加载器用于从jre/lib/ext目录加载标准的扩展,将jar放入该目录,即使没有任何类路径,扩展类加载器也可以找到其中的各个类

系统类加载器用于加载应用类,有CLASSPATH环境变量或-classpath命令选项设置的类路径中的目录里或JAR文件里查找这些类

在oracle的java语言实现中,扩展类加载器和系统类加载器都是java实现的,都是urlclassloader类的实例

类加载器的层次结构,向上依赖加载的顺序,app会要求ext加载,ext要求bootstrap加载
JAVA的类加载是父类委托机制,先找父类加载,不行再找子类加载
这是为了害怕用户自己定义class文件然后自己写一个类加载器来加载原本应该是JVM自己加载的类,会使JVM混乱和影响用户安全。







URL url = new URL("*.jar");
URLClassLoader ucl = new URLClassLoader(new URL[]{url});
Class<?> cl = ucl.loadClass("xxx.class");

因为URLClassLoader构造器中没有指定父类加载器,因此ucl的父亲就是系统类加载器

设置线程的加载器
Thread t .....
t.setContextClassLoader(loader);
在指定类加载器的时候会用到

编写自己的类加载器,继承ClassLoader即可,覆盖findClass方法
------解决思路----------------------
就是双亲委派模型,都是翻译,你的回答也不算错
------解决思路----------------------
能问出这种问题的多少有点脑残!
  相关解决方案