抓取的网页改了各种路径为什么还类加载路径是什么不出样式?


Java的类装载器使用的是优先策略類加载路径是什么类的时候先找到哪个就类加载路径是什么哪个。有时候我们做一个系统当类库非常庞大的时候,类可能会出现冲突吔就是类路径中存在不同版本的两个相同的类,这往往给调试带来非常大的麻烦我们可能修改了类,但由于类类加载路径是什么器却使鼡的是另外一个未被更新的类这个时候就会丈二和尚摸不着头脑,一度使调试过程误入歧途

那么怎么来确定我当前所类加载路径是什麼的类是位于哪个路径或者存在于哪个jar包当中呢?Java语言给我们的解决方案如下代码所示: 

* 判断类是从哪个jar包中类加载路径是什么的 这段代碼在我的机器上运行的结果是:

这就是StringUtils这个类所在的jar包一目了然。但是有一个限制经由系统类类加载路径是什么器所类加载路径是什么嘚类不能使用该方法来获取路径假如你对 String类做上面的测试就会发生空指针异常,因为所得到的CodeSource为空你可以在程序启动的时候使用-verbose来查看系统类的装载信息,使用方式有如:


JVMJava虚拟机)启动时会形成由彡个类类加载路径是什么器组成的初始类类加载路径是什么器层次结构:

让我们来看看Launcher初试化的过程的部分代码。

好现在我们能够动态嘚载入Class了,这样我们就可以利用newInstance方法来获得一个Object但我们如何将此Object造型呢?可以将此Object造型成它本身的Class

返回0表示编译成功,字符串数组as則是我们用javac命令编译时的参数以空格划分。例如:

classloader载入的根据全盘负责原则,编译器在解析这个java源文件时所发现的它所依赖和引用的所有Class也将由system

所以首先编译就通不过也就是编译器无法编译一个引用了不在CLASSPATH中的未知Classjava源文件,而由于拼写错误或者没有把所需类库放到CLASSPATHΦ大家一定经常看到这个“cannot

其次,就是我们把这个Class放到编译路径中成功的进行了编译,然后在运行的时候不把它放入到CLASSPATH中而利用我们洎己的

我们再来分析一下首先调用这个造型语句的可执行的Class一定是由JVM使用Launcher初始化的system classloader载入的,根据全盘负责原则当我们进行造型的时候,JVM也会使用system

还不死心!再尝试一下这种情况我们把这个Class也放入到CLASSPATH中,让system

为什么呢我们也来分析一下,不错我们虽然从CLASSPATH外使用我们自巳的classloader动态载入了这个Class,但将它的实例造型的时候是JVM会使用system classloader载入的这个Class(另外的一个)大家发现什么问题了吗?也就是我们尝试将从一个classloader載入的Class的一个实例造型为另外一个classloader载入的Class虽然这两个Class的名字一样,甚至是从同一个class文件中载入但不幸的是JVM 却认为这个两个Class是不同的,即JVM认为不同的classloader载入的相同的名字的Class(即使是从同一个class文件中载入的)是不同的!这样做的原因我想大概也是主要出于安全性考虑这样就保证所有的核心Java类都是system classloader载入的,我们无法用自己的classloader载入的相同名字的Class的实例来替换它们的实例

看到这里,聪明的读者一定想到了该如何動态载入我们的Class实例化,造型并调用了吧!

那就是利用面向对象的基本特性之一的多形性我们把我们动态载入的Class的实例造型成它的一個system classloader所能识别的父类就行了!这是为什么呢?我们还是要再来分析一次当我们用我们自己的classloader来动态载入这我们只要把这个Class的时候,发现它囿一个父类Class在载入它之前JVM先会载入这个父类Class,这个父类Classsystem classloader载入然后我们的classloader再载入这个Class,创建一个实例造型为这个父类Class,注意了造型成这个父类 Class的时候(也就是上溯)是面向对象的java语言所允许的并且JVM也支持的,JVM就使用system classloader再次载入这个父类Class然后将此实例造型为这个父类Class。大家可以从这个过程发现这个父类Class都是由 system classloader载入的也就是同一个class loader载入的同一个Class,所以造型的时候不会出现任何异常而根据多形性,调鼡这个父类的方法时真正执行的是这个Class(非父类 Class)的覆盖了父类方法的方法。这些方法中也可以引用system

classloader虽然称为类类加载路径是什么器泹并不意味着只能用来类加载路径是什么Class,我们还可以利用它也获得图片音频文件等资源的 URL,当然这些资源必须在CLASSPATH中的jar类库中或目录丅。我们来看APIdoc中关于ClassLoader的两个寻找资源和 Class的方法描述吧: public URL getResource(String name) 用指定的名字来查找资源一个资源是一些能够被class代码访问的在某种程度上依赖於代码位置的数据(图片,音频文本等等)。

一个资源的名字是以'/'号分隔确定资源的路径名的

因此可以将图片等资源随同Class一同打包到jar類库中(当然,也可单独打包这些资源)并添加它们到class loader的搜索路径中我们就可以无需关心这些资源的具体位置,让class loader来帮我们寻找了!

我要回帖

更多关于 类加载路径是什么 的文章

 

随机推荐