2016-04-09 5 views
0

デスクトップディレクトリにあるコンパイル済みクラスファイルからクラスオブジェクトをロードしようとしています。クラスパスまたはパッケージに関係なく外部クラスファイルをロードする

URLClassLoaderを使用して、コンパイル済みファイルTheClassToLoad.classからクラスのインスタンスを取得する私のプログラムのmainに2つの引数を渡しています。

私はクラスローディングプログラムのメインで、持っている:

String classFile_FilePath = args[1]; 
String className = args[2]; 
URL classUrl = new URL(classFile_FilePath); 
URLClassLoader ucl = new URLClassLoader(new URL[]{classUrl}); 

(args[0] is for something unrelated)

プロジェクトディレクトリにしながら、シェルからこのプログラムを実行している:

Me:ClassLoadingProgramRootDir Me$ java com.company.Main argZero file:///Users/Me/Desktop/ TheClassToLoad.class

私が発生した例外を見つけます:

スレッド「main」の例外java.la ng.ClassNotFoundException:TheClassToLoad.class

ので、Desktop/内のファイルTheClassToLoad.classはまだありURLClassLoaderは私が状況をデバッグする必要がある詳細を提供せずに例外が発生します。

私はJavaを使い慣れていないし、com.company.Classのようなクラスパスは、パッケージのディレクトリ構造に基づいてクラスの真のクラス名を参照する必要があることに注意してください。しかし、この場合、私は単にURLClassLoaderが、マシン上のどこかに座っている任意のコンパイルされたクラスファイルのClassオブジェクトのインスタンスを私に与えることを要求しています。

+1

クラスに 'package'ステートメントがある場合は、ロードして使用するときにそのステートメントを尊重する必要があります。 – bmargulies

答えて

1

URLClassLoaderの場合、URLはクラスファイル自体ではなく、クラス+パッケージ構造を含むディレクトリである必要があります。あなたの場合、それはfile:///Users/Me/Desktop/でなければなりません。

loadClassの引数は、クラスファイルの名前ではなく、クラスの名前である必要があります。あなたの場合、それはTheClassToLoadでなければなりません。

クラスがパッケージ(たとえば、my.pkg.TheClassToLoad)にある場合、あなたはにloadClassの引数としてそのクラス名を使用する必要があり、そして場合のURLClassLoaderのためのURLは、まだパッケージ構造(例えば、file:///Users/Me/Desktopのルートでなければなりませんファイルはfile:///Users/Me/Desktop/my/pkg/TheClassToLoad.classです)。

+0

"完全に指定する"クラス名を使用していないことに感謝します –