簡體   English   中英

顯式加載-java.lang.ClassLoader

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM