首页 > 代码库 > ClassLoader
ClassLoader
什么是类加载器
java类加载器是通过一个类的全限定名来获取描述此类的二进制字节流,来进行加载;
加载器是在虚拟机外部实现的,方便让程序自己决定获取所需要的类。
JAVA有哪些类加载器
对于开发人员来说,java的类加载器有四种,全都继承自抽象类java.lang.ClassLoader:
启动类加载器(Bootstrap ClassLoader)
它是虚拟机的一部分,无法被Java程序直接引用,所以System.class.getClassLoader()结果为null;
负责加载JAVA_HOME\lib目录中规定的类库,例如rt.jar的java.lang.object等核心api。
扩展类加载器(Extension ClassLoader)
负责加载<JAVA_HOME>\lib\ext目录,可以被开发人员直接使用。
程序类加载器(Application ClassLoader)
程序默认的加载器,负责加载ClassPath下的类或jar,可以被开发人员直接使用。
自定义类加载器
类加载器之间的关系
启动类加载器 > 扩展类加载器 > 程序类加载器 >自定义类加载器:
它们之间不是继承关系,而是通过组合实现的,而这种模型也被称为双亲委派,如下图:
双亲委派模型
概念
双亲委派的代码逻辑在java.lang.ClassLoader.loadClass()中;
他是说某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归;
如果父类加载器可以完成类加载任务,就成功返回;
只有父类加载器无法完成此加载任务时,才自己去加载。
为什么使用双亲委派
因为java的设计体系,比如继承,所有的类都必须继承object类,那就必须确定object是唯一的,否则我们怎么知道该继承哪个object;
而双亲委派会把加载类递归交给上一层加载器去做,如果加载不了,就自己完成,这一确保了类在系统中的唯一性。
ClassLoader
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。