簡體   English   中英

使用Eclipse和OSGi將類動態加載到Java類路徑

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

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