2011-06-02 13 views
33

Javaクラスファイルを動的にロードして、jarファイルにコンパイルされたプログラムがディレクトリ内のすべてのクラスファイルを読み込んで使用できるようにするにはどうすればよいでしょうか?それで彼らは瓶に関連して必要なパッケージ名を持っていますか?Javaクラスファイルを動的にロードする方法

答えて

70

私はそれがあなたの後にClassLoaderだと思います。

まず、クラスパスにないクラスファイルをロードする以下の例を見てみることをお勧めします。

// Create a File object on the root of the directory containing the class file 
File file = new File("c:\\myclasses\\"); 

try { 
    // Convert File to a URL 
    URL url = file.toURL();   // file:/c:/myclasses/ 
    URL[] urls = new URL[]{url}; 

    // Create a new class loader with the directory 
    ClassLoader cl = new URLClassLoader(urls); 

    // Load in the class; MyClass.class should be located in 
    // the directory file:/c:/myclasses/com/mycompany 
    Class cls = cl.loadClass("com.mycompany.MyClass"); 
} catch (MalformedURLException e) { 
} catch (ClassNotFoundException e) { 
} 
+4

1のURLClassLoaderを移動するための方法です! – OscarRyz

+0

はい、ClassLoaderは私が探しているものだと思います。しかし、ロードされたクラスを効果的に使用する方法について考えることはできますか?私はそれがインターフェイスを実装することができます...しかし、どのように私はそのインターフェイスを参照することができますか?うーん...おそらく、コンパイル済みのjarファイルを外部のjarファイルとして追加するのですか?その場合、ロードされたクラスのパッケージはどうしたらいいですか?私が持っているもの:/thing/myjar.jarとthing/loadedclasses/class.classの場合、宣言されたパッケージはそのクラスのために何でしょうか? – MirroredFate

+0

はい、ロードするクラスが実装/拡張するいくつかのインタフェースまたは抽象クラスに同意する必要があります。 (または、ロードされたクラスのリフレクションに完全に頼っています。) – aioobe

1

ディレクトリをクラスパスに追加すると、アプリケーションの起動後にクラスを追加できます。これらのクラスは、ディレクトリに書き込まれるとすぐにロードできます。

7
MyClass obj = (MyClass) ClassLoader.getSystemClassLoader().loadClass("test.MyClass").newInstance(); 
obj.testmethod(); 

または

MyClass obj = (MyClass) Class.forName("test.MyClass").newInstance(); 
obj.testmethod(); 
関連する問題