簡體   English   中英

Java:動態加載外部類

[英]Java: Dynamically loading external classes

我正在編寫一個將加載Java腳本的應用程序。 我目前有一個GUI,該GUI利用JFileChooser允許用戶從其計算機中選擇腳本。 腳本文件可以在任何地方。 它不在類路徑上。 只有一個File對象來表示該腳本文件,我如何獲得它的Class表示形式?

我知道要加載一個類,您需要它的二進制名稱,即in.this.format 但是,這樣做的問題是我不知道腳本編寫者如何打包它。 例如,他/她在開發腳本時可能會將腳本文件放入包foo.bar 下載此腳本並將其放在我的文檔中后(即不在 foo/bar ),在不知道腳本已打包在foo.bar情況下無法加載該腳本。 如果類名是Test ,我嘗試創建一個URLClassLoader做指向腳本文件new URLClassLoader(new URL[] { new URL(scriptFile.toURI().toURL()) })和我做classLoader.loadClass("Test")我將得到一個異常,說該類的名稱錯誤,而正確的名稱是foo.bar.Test 但是我應該如何提前知道呢?

這就是我現在所擁有的:

public class ScriptClassLoader extends URLClassLoader {

    private final File script;

    public ScriptClassLoader(File script) throws MalformedURLException {
        super(new URL[] { script.toURI().toURL() });
        this.script = script;
    }

    public Class<?> load() throws ClassNotFoundException {
        String fileName = script.getName();
        String className = fileName.substring(0, fileName.indexOf(".class"));
        return loadClass(className);
    }
}

人們如何在運行時加載不屬於程序的類路徑的腳本,並且該類的二進制名稱未知?

如果您只需要從給定的.class文件中加載一個類,則無論此類的命名方式如何,您都可以自己加載數據,然后調用ClassLoader的defineClass()方法:

RandomAccessFile raf = new RandomAccessFile(script, "r");
try {
    byte[] classData = new byte[(int) raf.length()];
    raf.readFully(classData);
    return super.defineClass(null, classData, 0, classData.length);
} finally {
    raf.close();
}

暫無
暫無

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

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