![](/img/trans.png)
[英]load class not in classpath dynamically in web application - without using custom classloader
[英]Load a class to Java classpath dynamically using Eclipse and OSGi
結合了該站點上許多文章以及其他許多文章中的信息,我得到了以下代碼,以在運行時動態地向類路徑添加一個包含類的目錄,並在該目錄中加載一個類。
我正在使用OSGi捆綁包,並從Eclipse中運行“ Eclipse應用程序”(一種運行配置)。
這是我正在使用的代碼:
案例1 :(兩種情況都是我嘗試做相同事情的不同事情。)
File file = new File("/Users/alek/fastFIX/myJPass/");
URL url = file.toURI().toURL();
URL[] urls = new URL[]{url};
ClassLoader cl = new URLClassLoader(urls);
Class cls = cl.loadClass("GuiLauncher"); //the file GuiLauncher.class is in the /Users/alek/fastFIX/myJPass/ directory
Class[] argTypes = new Class[] { String[].class };
Method main = cls.getDeclaredMethod("main", argTypes); //trying to run the main class
main.invoke(null, (Object) args);
我沒有收到任何錯誤,也沒有任何反應。 我還嘗試了以下內容,因為我實際上需要已加載的類才能與其他(已加載的)類進行交互。
情況2:
ClassLoader currentThreadClassLoader = Thread.currentThread().getContextClassLoader();
URLClassLoader urlClassLoader = new URLClassLoader(new URL[] { new File("/Users/alek/fastFIX/myJPass/").toURL() }, currentThreadClassLoader);
Thread.currentThread().setContextClassLoader(urlClassLoader);
然后我這樣加載:
Class<?> c = Class.forName("GuiLauncher");
或像這樣:
Class<?> c = Thread.currentThread().getContextClassLoader().loadClass("GuiLauncher");
並嘗試像這樣調用main函數:
Class[] argTypes = new Class[] { String[].class };
Method main = cls.getDeclaredMethod("main", argTypes); //trying to run the main class
main.invoke(null, (Object) args);
這里也什么也沒有發生。
有什么線索可能發生嗎? 我在這里和所有其他地方都讀過所有相關的帖子,但沒有運氣。
在OSGI框架中,有必要將OSGI類加載器添加為父類,如下所示:... ClassLoader cl = new URLClassLoader(new URL [] {file.toURI()。toURL()},this.getClass() .getClassLoader()); ...
在情況1中,我懷疑GuiLauncher類已經在類路徑上,因此可能會被默認的類加載器加載。 在設置動態類加載器之前,請嘗試執行Class.forName()
,以確認沒有可用的類。 如果您使用的是Eclipse,則需要注意,該類未包含在Eclipse的類路徑中,通常會發生這種情況。 您可能需要編譯一次,然后將.java
和.class
文件移至其他位置以將其從Eclipse中隱藏!
情況2:
Class.forName("GuiLauncher");
將無法按預期工作,因為它將使用系統類加載器。 這應該失敗,因此我在上面懷疑。 您需要使用此方法的其他版本來指定動態類加載器:
Class.forName("GuiLauncher", true, urlClassLoader)
以下代碼對我有用。
import java.net.*;
import java.lang.reflect.*;
import java.io.File;
public class Main{
public static void main(String[] args)
{
try{
Class cls = Class.forName("Plugin");
}
catch(Exception e){
System.out.println("Nothing there!");
}
try{
File file = new File("plugin");
ClassLoader cl = new URLClassLoader(new URL[]{file.toURI().toURL()});
Class cls = Class.forName("Plugin", true, cl);
Method main = cls.getDeclaredMethod("main", new Class[] { String[].class });
main.invoke(null, (Object) args);
}
catch(Exception e){
e.printStackTrace();
}
}
}
Plugin
類是在plugin
子文件夾中編譯的,因此它不在用於運行Main
的類路徑上,如第一個Class.forName()
。
public class Plugin{
public static void main(String[] args)
{
System.out.println("Plugin was invoked!");
}
}
並打印出:
Nothing there!
Plugin was invoked!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.