4

実行時にクラスを動的に作成する必要があるプロジェクトがあります。使用可能な情報は、文字列形式のクラス名のみです。私は今、いくつかの非常に単純なReflectionライブラリメソッドを使用してテストしていますが、私の質問は、「動的に」ロードしようとしているクラスが同じディレクトリにある場合、完全に修飾されたクラス名を指定する必要があるのはなぜですか?私はLinuxを使用しており、開発環境はありません。同じディレクトリで呼び出そうとしているすべてのクラスだけを使用しており、パッケージ宣言はまったくありません。Reflectionを使用するにはパッケージシステムを設定する必要がありますか?これがこの小さなコードスニペットです...

public class ReflectionTest {
    public static void main(String[] args) {
        try {
            Class nodeClass = Class.forName("Node");
            System.out.println(nodeClass.toString());
        } catch (ClassNotFoundException cnfe) {
            System.out.println("Error");
        }
    }
}

さて、これはエラーをスローします。しかし、Nodeのインスタンスを作成し、それをで完全修飾されたクラス名を取得するとNode.getClass().getName()、代わりに「Node」が取得されます。そのため、Reflectionライブラリが「java」を使用してJVMを呼び出すのと同じように機能しない理由がわかりません。パッケージ名が指定されていない場合は、同じディレクトリを検索するだけです。どのクラスにもパッケージ名が関連付けられていない場合に、ユーザー定義のクラスでこのライブラリを使用する方法がわかりません。

4

5 に答える 5

2

コードは説明どおりに機能するはずです。つまり、電話をかけることができれば、も電話をかけるnew Node()ことができるはずClass.forName("Node")です。パッケージのないクラスでこれを試したところ、すべてが期待どおりに機能することを確認しました。

Node.classクラスパスで利用できますか?現在のディレクトリをクラスパスに追加することで、これを機能させることができます。

于 2012-06-20T20:46:22.503 に答える
1

パッケージ名は、Javaネーミングシステムの不可欠な部分です。ただし、クラスがパッケージを宣言していない場合、それはルートパッケージにあり、投稿したコードは機能するはずです。

私の推測では、ディレクトリは実際にはCLASSPATHにありません。現在のディレクトリ(./)を追加して、それが実際に現在のディレクトリであることを確認するか、ディレクトリを明示的に(絶対パス)CLASSPATHに含めてみてください。CLASSPATHを設定する方法については、ドキュメントを参照してください(環境、jvmオプション、ランタイムがオプションです)

于 2012-06-20T20:47:51.473 に答える
0

まず、ロードしようとしているクラスがクラスパスにあることを確認する必要があるため、jvmを起動するときに、現在のフォルダーを追加してみてください。java -cp . ReflectionTest

パッケージの概念は、アイテムを整理し、名前を再利用できるようにすることです。完全修飾名を指定することで、正しいNodeクラスを使用していることを確認できます。たとえばorg.w3c.dom.Node、Javaで暗黙的に出荷されるようなものではありません。

于 2012-06-20T20:46:11.413 に答える
0

ReflectionTest.java上記と以下を正確に使用して私のために動作しますNode.java

public class Node { }

コンパイルNode.javaもしましたReflectionTest.javaか?クラスにはクラスReflectionTestへのコンパイル時の依存関係がないため、javacはコンパイル時にNode自動的にコンパイルされません。Node.classReflectionTest.class

于 2012-06-20T20:46:13.500 に答える
0

Javaにはクラスのディレクトリの概念はありません。クラスはパッケージに含まれているか、デフォルトのパッケージに含まれており、クラスパスに含まれている必要があるディレクトリまたはjarからロードされます。

を含むディレクトリがNode.classクラスパスにある場合、上記のコードは機能するはずです。

ただし、デフォルトのパッケージを使用することは非常に悪い習慣です。すべてのクラスはパッケージに含まれている必要があります。

于 2012-06-20T20:46:53.110 に答える