10

私のメインでは、次のステートメントがあります

Class booki = Class.forName("Book");

java.lang.ClassNotFoundException例外をスローする

フルパスを使用するClass booki = Class.forName("javatests.Book");と問題ありません。

メインクラスと Book クラスは同じパッケージにあり、私も使用しようとしimport static javatests.Book.*;ましたが、フルパスを設定しないと例外がスローされますjavatests.Book。誰かが私に理由を説明できますか?

4

5 に答える 5

12

Class.forName完全修飾クラス名をクラスに解決します。メソッドは、呼び出し元クラスのパッケージからも呼び出された場所も知らないため、呼び出し元クラスimportの s も役割を果たしません。

于 2013-10-30T06:22:57.740 に答える
3

ドキュメントClass#forNameから

 public static Class<?> forName(String className)
                    throws ClassNotFoundException

パラメータ:
className - 目的のクラスの完全修飾名。

したがって、これはスローされませんClassNotFoundException

Class booki = Class.forName("javatests.Book");  

たとえばjava.lang.*、Javaプログラムでパッケージをインポートする必要はありませんが、パッケージThreadからクラスをロードjava.langするには、書く必要があります

Class t = Class.forName("java.lang.Thread");

上記のコード フラグメントは、名前が付けられたクラスのランタイム クラス記述子を返します。java.lang.Thread

于 2013-10-30T06:24:53.730 に答える
0

まず、Book クラスがパッケージ javatests に含まれている必要があります。
JVM は、クラスパスを介して名前でクラスをロードします。クラスパスに「Book」という名前のクラスはありません。そのため、Class.forName("Book") の言い訳をすると、JVM は ClassNotFoundException を返します。しかし、「Class.forName("javatests.Book")」は、「Book」という名前のクラスがパッケージ「javatests」にあることを JVM に伝えます。そのため、JVM はそれを見つけてロードできます。

私の答えがお役に立てば幸いです:)

于 2013-10-30T06:38:37.190 に答える
0

同じパッケージ内にない限り、常に修飾されたクラス名が必要です。パッケージでクラス foo を定義すると、メソッドを呼び出すことができますが、SecureRandom をインポートしてもClass testClass = Class.forName("foo")呼び出せません。Class testClass = Class.forName("SecureRandom");それが機能の仕組みです。おそらく、ローカル パッケージ内のものを見つけようとするショートカットがありますが、その背後ではあまり機能しません。

于 2013-10-30T06:25:24.320 に答える