2017-11-22 17 views
0

ディレクトリのクラスパスをクラスパッケージに設定するのが苦労しています。私はコマンドライン引数としてディレクトリを取るjarファイルを実行しようとしています。プログラムは、ディレクトリを使用してフォルダ内のクラスファイルにアクセスし、リフレクションを使用してクラスのフィールドとメソッドを探索します。クラスパスを設定した後でディレクトリクラスにアクセスできません

​​

私はその後、各クラスの名前を取得し、CLASSLISTを通過し、クラスにアクセスするClass.forName()メソッドを使用します。

Class c = Class.forName(className); 

上記の行が機能するには、クラスパスをクラスを含むディレクトリのアドレスに設定する必要があります。私は以下のようなパッケージに属していないクラスのディレクトリを使用していたときに、プログラムがうまく実行するために取得することができます

はしかし、次の行のために、独占は、パッケージですプログラムはテスト目的でClass.forName(className)

java -cp "Explorer.jar:/Users/john/Desktop/Programming\ Project/Monopoly/build/classes/monopoly/" explorer.ExplorerDemo /Users/john/Desktop/Programming\ Project/Monopoly/build/classes/monopoly/ 

を呼び出した後ClassNotFoundExceptionをスローし、私は `Class.forNameのを(調整しようとした)以下のようにパッケージ名が含まれるように呼び出します。

Class c = Class.forName("monopoly."+className); 

ただし、これもClassNotFoundExceptionをスローします。

答えて

0

Class.forNameは、現在のクラスのClassLoaderのコンテキスト内でクラス情報を取得するためのショートカットです。 Javadocのはこれがあなたのクラスのディレクトリは、ランタイム・パラメータとして指定し、元のクラスパスの一部ではないされていることを提供

Class.forName("Foo", true, this.getClass().getClassLoader())

と同等であると述べて、私はあなたのディレクトリを指すされるカスタムURLClassLoaderインスタンスをインスタンス化することをお勧め。

サンプルコード:だからあなたのアプローチで、あなたもクラスパスを設定する必要はありませんRun a JAR file from the command line and specify classpath

+0

:クラスパス命令とJARについては

public class ReflectionClassAnalysis { public static void main(String[] args) throws MalformedURLException, ClassNotFoundException { // URLClassLoader supports both directories and jar files Path directory = Paths.get("/some/directory/"); Path jar = Paths.get("/some/binary.jar"); // You may be interested in providing parent ClassLoader for your new instance // You can either use current class ClassLoader like ClassLoader contextClassLoader = ReflectionClassAnalysis.class.getClassLoader(); // or current thread ClassLoader // ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); URLClassLoader myClassLoader = new URLClassLoader( new URL[]{ directory.toUri().toURL(), jar.toUri().toURL() }, contextClassLoader ); // You may use ClassLoader directly to load class meta Class<?> externalClass = myClassLoader.loadClass("your.class.name"); // or supply ClassLoader to forName method // Class.forName("your.class.name", true, myClassLoader); // Do your class analysis here } } 

を参照してください? – Brosef

+0

いいえ、新しいClassLoaderに対してプログラムで設定します。 –

+0

私はあなたのアプローチがうまくいくと確信していますが、私はクラスパスを使ってこれを行う方法を理解したいと思います。 – Brosef

関連する問題