2016-04-06 10 views
4

.classファイルへのパスがあり、実行中のプログラムからインスタンス化する必要があります。 私はこのクラスを "ロード"する必要がありますが、そのクラスパスは私の.jarまたは私のプロジェクトにありません。クラスパスはClass.forName()を使用できません。 どうすればこのクラスをインスタンス化できますか?リフレクションを使用して.classファイルからJavaクラスをインスタンス化する

+4

URLClassLoader – ControlAltDel

答えて

4

あなたに次の続行することができます

File myFolder = new File("myfolder"); 
URLClassLoader classLoader = new URLClassLoader(new URL[]{myFolder.toURI().toURL()}, Thread.currentThread().getContextClassLoader()); 
Class<?> myClass = Class.forName("my.package.Myclass", true, classLoader); 
Myclass obj = (Myclass)myClass.newInstance(); 

まずあなたが親としてコンテキストClassloaderを使用してURLClassLoaderのインスタンスを作成し、その後、あなたは、この新しいClassLoaderを使用してクラスをロードし、最終的にあなたがインスタンスを作成します(ここではそれが呼び出します引数のないコンストラクタ)

+0

を使用する必要があります。うまくいきますが、Class.forName()で呼び出された「MyClass」のパッケージ名を渡すことはできますか?私はパッケージを知っているので、私のプログラムのために "アドオン"を作成したい場合、彼のクラスは私のものと同じパッケージ名でなければなりません。私はクラス名を簡単に得ることができます(.classの名前)が、私はそのパッケージの名前を得ることができますか? – psyked

+1

これは、クラスファイル自体に定義されているディレクトリとパッケージを尊重する必要があるため、_MyClass.class_が_myfolder_にある場所によって異なります。パッケージ名がfoo.barの場合、ファイルは_myfolder/foo/bar/MyClass.class_にあり、 "foo.bar.MyClass"を使用する必要があります。クラスに定義されているパッケージがない場合は、クラスを_myfolder_の直下に配置する必要があります。次に、実際には "MyClass" –

関連する問題