このサイトと他の多くの投稿からの情報を組み合わせて、クラスを含むディレクトリを (実行時に) クラスパスに動的に追加し、そのディレクトリ内にクラスをロードする次のコードを取得しました。
私は 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");
次のようにメイン関数を呼び出してみてください。
Class[] argTypes = new Class[] { String[].class };
Method main = cls.getDeclaredMethod("main", argTypes); //trying to run the main class
main.invoke(null, (Object) args);
ここでも何も起こりません。
何が起こっているのか手がかりはありますか?ここで関連するすべての投稿を読みましたが、運が悪い他の多くの場所を読みました。