2

これは私が以前に経験した実際の例です、そしてこれは私がこの謎を熟考しそして疑問に思うようにする何かです。

以前:クラスの名前を使用するだけでクラスを動的にインスタンス化する方法がわかりません。

後:他の誰かのJavaソースコードを調べて、衝突検出の方法など、上記とは関係のないものを探すことにしましたが、クラスをインスタンス化する方法に関する私の質問に正しく答えるコードに偶然出くわしました。動的に。

問題のコードは次のとおりです。

A a = (A) Class.forName("A").newInstance();

AJavaソースファイルの名前はどこにありますかA.java

ここから、私はそれに興味をそそられただけでなく、JavaプログラマーがJava言語のドキュメントだけを与えられた場合、これらすべてをどのように学ぶのか疑問に思い始めました。

彼らがJava言語を練習している場合、彼らはどのようにしてドキュメントのどこを探すべきかを知るのでしょうか?初心者のJavaプログラマーは、専門家のJavaプログラマーからいくつかの経験を積んでいることを知っていますが、最初はドキュメントのどこを探すべきかわからない場合、専門家のJavaプログラマーはどこでこれらすべてを学びますか?

それとも、1ページ目からドキュメントの最後まで読んで、可能な限り厳密にフォローし、そこから始めますか?それが完了するまでには長い時間がかかり、それを行うのは印象的な偉業です。

4

1 に答える 1

1

通常、あなたはグーグルでJavaドキュメントを検索します...それを含むOracleのウェブサイトにあなたを送ります。http://docs.oracle.com/javase/7/docs/api/

場合によってはAPIのみが必要ですが、完全な形式の例が必要な場合は、コードサンプルやスニペット、またはそれ自体で解決したい問題(つまり、「javaはクラスを動的にインスタンス化する」)を検索できます。

動的インスタンス化の問題については、実行できるClassLoaderの機能がたくさんありますが、最も基本的な例は、見つけたものと似ています...しかし、落とし穴があります。

コードでAクラスを参照すると、jvmが自動的にそれをロードします。あなたがするとき

A a = (A)Class.forName("A").newInstance();

すでに把握しているAクラスを参照します。

実行できることは、インスタンス化するクラスが実装する必要のあるインターフェイスを次のように作成することです。

String classPath = ...
AInterface a = (AInterface)Class.forName(classPath).newInstance();

そして、そこから使用します。

ただし、try-catchブロックを追加することを忘れないでください。これは、newInstanceメソッドは、実行時にtiをインスタンス化しようとしたときに、参照されるクラスにデフォルトコンストラクターがあるかどうかのみを認識し、ない場合は例外が発生するためです。

コンストラクター自体によってスローされた例外についても同じことが言えます。カプセル化されて、ユーザーに返されます。

于 2012-08-18T18:11:09.903 に答える