我是靠谱客的博主 典雅荔枝,最近开发中收集的这篇文章主要介绍使用URLClassLoader报错not class found exception,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

使用ClassLoader时需要了解ClassLoader的双亲委任模型,不同类型的classloader及加载顺序为:

1. bootstraploader:

bootstrap加载器,是c++编写的,在java虚拟机启动后初始化,用于加载%java_home%/jre/lib及%java_home%/jre/classes指定的类。

 

2.ExtClassLoader

是由java代码编写的,由bootstraploader加载并在加载时将其父加载器设置为bootstraClassloader。主要用于加载%JAVA_HOME%/jre/ext路径下的所有classes目录一级java.ext.dirs系统变量指定的路径中的类库。

 

3.AppClassloader:

是由java代码编写的,由ExtClassLoader进行加载并将其父加载器设置为ExtClassLoader。classloader的getSystemClassLoader方法获得的就是改加载器。改加载器主要用于加载classpath指定路径下的jar或者class类。这也是java程序默认的类加载器。

 

双亲委派模型

每个类加载器都有自己的加载缓存,当一个类被加载后会将该类放入缓存,下载加载时直接返回该类。双亲委派模型加载类时主要执行以下几个步骤:

1.classloader首先从自己加载的类中查询该类是否已经加载,若查询到该类则直接返回

2.若classloader没有查询到要加载的类,则classloader会将该类传递给父级classloader,委托父级加载器加载该类,父级classloader在自己的缓存中查找该类,若找到则返回该类,否则再委托自己的父级加载器。以此类推直至找到该类或到bootstrapclassolader。

3.若上述过程没有查询到需要加载的类,再由classloader自身进行该类的加载并放入加载缓存。

 

为什么要使用双亲委派模型

1.命名空间

在java虚拟机中,已classloader加类的全限定名来作为类在JVM中的唯一标识。

双亲委派模型保证了classloader之间的交互性,上级类加载器加载的类在所有子级类加载器中是共享的。

 

问题分析及解决

上述问题产生的背景是使用classloader动态加载jar及class,在加载jar时使用的是Appclassloader,而加载class时使用的是通过Thread.currentTread.contextClassLoader获取的普通类加载器。导致加载的jar及class不在同一上下文中。从而出现CNF错误。

所以在使用classloader加载jar或类时,出现上述问题需要注意使用的classloader的上下文是否相同

 

关于双亲委派模型的概念摘自https://blog.csdn.net/wangyang1354/article/details/49448007/

java新手,仅以此文做问题记录,同时希望能够帮到有需要的朋友,文中若描述有误欢迎斧正

最后

以上就是典雅荔枝为你收集整理的使用URLClassLoader报错not class found exception的全部内容,希望文章能够帮你解决使用URLClassLoader报错not class found exception所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部