[英]Explicit loading - java.lang.ClassLoader
在第一種情況下,要使用以下代碼顯式加載test.ClassLoaderTest
,
public ClassLoaderTest{
public static void main(String[] args){
.....
Class.forName("test.ClassLoaderTest", true,
ClassLoaderTest.class.getClassLoader().getParent());
....
}
由於可見性原理,將調用Launcher$ExtClassLoader
實例的findClass()
方法來加載test.ClassLoaderTest
並出現以下錯誤,
java.lang.ClassNotFoundException: test.ClassLoaderTest
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at sun.misc.Launcher$ExtClassLoader.findClass(Launcher.java:229)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at test.ClassLoaderTest.main(ClassLoaderTest.java:29)
在第二種情況下,在顯式加載test.ClassLoaderTest1
,使用
public ClassLoaderTest{
public static void main(String[] args){
.....
Class.forName("test.ClassLoaderTest1");
....
}
Launcher$AppClassLoader
實例的loadClass()
方法最終用於加載test.ClassLoaderTest1
類,
其中test.ClassLoaderTest1
是錯誤的類文件,導致以下錯誤,
java.lang.ClassNotFoundException: test.ClassLoaderTest1
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at test.ClassLoaderTest1.main(ClassLoaderTest.java:16)
在這兩種情況下,類加載工作均由java.net.URLClassLoader.findClass()
Class.forName()
內部調用getClassLoader()
來知道已經加載了該類的類加載器。
在第二種情況下,當Class
通過調用ClassLoader cl = getClassLoader0();
獲得類加載器實例(Launcher $ AppClassLoader類型ClassLoader cl = getClassLoader0();
再次調用類加載器實例。
java.lang.ClassLoader
主要用於子類化自定義類加載器嗎? 加載的類不是CLASSPATH中可用的,而是來自網絡源等的。
在Javadoc中,
public **abstract** class ClassLoader
extends Object
有不同的ClassLoader實現,它們使用不同的策略來定位和讀取組成類的字節流。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.