簡體   English   中英

為什么我不能通過ExtClassLoader加載類?

[英]Why can't I load my class by ExtClassLoader?

這是我的Java項目的結構:

package: com.study.test
              ---- HelloWorld.java
              ---- Test.java

HelloWorld.java的內容:

package com.study.test;

public class HelloWorld {}

Test.java的內容:

package com.study.test;

public class Test {

    public static void main(String[] args) {
        System.out.println(System.getProperty("java.ext.dirs"));
        System.out.println(HelloWorld.class.getClassLoader());
    }

}

java.ext.dirs ”的值是:

D:\glassfish4\jdk7\jre\lib\ext;C:\windows\Sun\Java\lib\ext

我將類文件HelloWorld.class放在目錄中:

D:\glassfish4\jdk7\jre\lib\ext\com\study\test

但是“ System.out.println(HelloWorld.class.getClassLoader()); ”的輸出是:

sun.misc.Launcher$AppClassLoader@70a0afab

為什么ExtClassLoader無法加載類HelloWorld? ExtClassLoader是AppClassLoader的父類加載器。

擴展類加載器僅從Jar文件中加載類。

采取以下結構

src/Test.java
src/HelloWorld.java

Test.java修改為(實際上並不需要編輯 ,只是為了表明在編譯期間未完成解析)

package com.study.test;
public class Test {
    public static void main(String[] args) throws Exception {
        System.out.println(System.getProperty("java.ext.dirs"));
        System.out.println(Class.forName("com.study.test.HelloWorld")
            .getClassLoader());
    }
}

編譯它們

mkdir bin/
javac -d bin/ src/Test.java src/HelloWorld.java

創建一個包含類的Jar文件

jar cf test-hello.jar -C bin/ .

驗證Jar文件的內容

jar tf test-hello.jar

輸出

META-INF/                       
META-INF/MANIFEST.MF            
com/                            
com/study/                      
com/study/test/                 
com/study/test/HelloWorld.class 
com/study/test/Test.class       

test-hello.jar移動到擴展目錄中

mv test-hello.jar D:\glassfish4\jdk7\jre\lib\ext

運行您的課程Test

java com.study.test.Test

輸出類似(從您的查詢中復制的目錄)

D:\glassfish4\jdk7\jre\lib\ext;C:\windows\Sun\Java\lib\ext
sun.misc.Launcher$ExtClassLoader@70dea4e

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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