2016-04-03 11 views
1

シナリオ:ドライブ内のフォルダにJavaクラスがあります。私は特定のクラスからRegexというメソッドを呼び出す必要があります。 Reflection APIを使用してメソッドを呼び出すことはできますか?私は次のコードを持っています:Reflection API - ClassNotFound例外

File dir = new File("H:/TestFolder/sample"); 
    File[] directoryListing = dir.listFiles(); 
    if (directoryListing != null) { 
     for (File child : directoryListing) { 
      File[] dirListing = child.listFiles(); 
      for (File fileName : dirListing) { 
       if (fileName.getName().equals("Regex.java")) { 
        Class<?> clazz; 
        try { 

         clazz = Class.forName("Regex"); 
         Constructor<?> ctor = clazz.getConstructor(); 
         Object regexClass = ctor.newInstance(); 
....} 

私はClassNotFoundExceptionを取得します。誰かが私に間違っていることを教えてもらえますか?

+0

最初に、コンパイルする必要のあるJavaソースファイルからクラスをロードすることはできません。フォルダからコンパイルされたクラスファイルをロードする場合は、[this](http://stackoverflow.com/questions/6219829/method-to-dynamically-load-java-class-files) –

+0

をチェックします。私は 'Regex。 class'はデフォルトパッケージのクラスパスにあります。 –

+0

@PeterLawrey Sir、Class.forName(..)のパッケージ名が不足していると思われますか?私は答えのセクションでこれを述べました。私が間違っている場合、親切に私を修正してください。 –

答えて

1

クラスは[packageName]というパッケージ内で宣言しているので、実際には[packageName].Regexと呼ばれています。

を編集します。 Peter Lawreyは、ソースがH:/TestFolder/sampleである場合、パッケージはsampleでなければならないと指摘した。クラスはsample.Regexと呼ばれ、Regexではありません。これは、基本パッケージがTestFolderではないと仮定しています。そうであれば、TestFolder.sample.Regex。私はあなたがそのアイデアを得ると確信しています。 Mr. Lawreyのコメントbelowをお読みください。

Class.forName()パッケージ名を指定するクラス名を指定します。 className変数の[docs]から、

className - 目的のクラスの完全修飾名。

この特異性は、ClassNotFoundExceptionを取る必要があります。

。私はあなたのRegex.javaRegex.classファイルを生成するようにコンパイルされていることを期待しています。あなたのIDEはこれをしているはずです。

+0

どのパッケージであるか知るには、 '.java'ファイルの先頭にある' package xxx; '行を見てください。そのような行がない場合は、デフォルトパッケージに含まれています。 –

+0

私はパッケージを持っていません。 JavaProjectの名前です。それはサンプルです(タイプミスで申し訳ありません)。 – MadxG

+0

ファイルの先頭にパッケージがない、または 'sample'や' Sample'と呼ばれるパッケージはありませんか?元の投稿で更新するといいですね。 **サイドノート**。パッケージがリストされていない場合は、 '(デフォルトパッケージ)'を使用する代わりに、パッケージを持つことをお勧めします。 –

0

愚かな質問かもしれませんが。これらのクラスがクラスパスにあることを確認しましたか?

そのフォルダはコードのsrcですか、それとも、検査して読み込む外部フォルダですか?

クラスは、リフレクションによってオブジェクトを初期化するためにクラスパス内にある必要があります。

+0

外部フォルダです。だから私は外部のフォルダから検査して読み込むことができないのですか? – MadxG

+0

あなたは検査することができます。しかし、これらのファイルはテキストフラットファイルのようになります:-)。 executsbleクラスのようなものはありません。 – Laiv

関連する問題