java.lang.Object
のgetClass()
メソッドを知っています。しかし、私のアプリケーションでは、私はすべてのクラスを知っています。では、このメソッドを使用する実際の目的は何ですか?java.lang.ObjectのgetClass()メソッドが必要ですか?
答えて
あなたはReflectionの素晴らしい世界に向かっています。リフレクションを使用すると、プログラムでクラスを検査したり、フィールドを設定したり、メソッドを呼び出すことができます。これは本当に強力なものです。毎日使用するほとんどのフレームワーク(Hibernate、Spring、Guiceなど)物事を起こすために非常に重く依存しています。
非常に便利です良い概観。しかし、*フレームワーク*で素晴らしいことができますが、古典的なビジネスコードでは、コード構造を判読不能にすることが簡単にできるので、通常はそれを避けるべきです。 –
getClassは通常、equalsメソッドをオーバーライドするときにビジネス・コードで使用され、他のオブジェクトのクラスがこのオブジェクトのクラスと同じであることをチェックします。 –
getClass()
はObjectのパブリックメソッドなので、allクラスのすべてのインスタンスに対して継承されます。何らかのスーパータイプ(スーパークラスやインターフェースなど)を扱っていて、実装クラスを知りたい場合は、getClass()
はどのオブジェクトのクラスでも教えてくれます。その後、クラスを検査して詳細な情報を調べることができます。
簡単な例:
public static void doSomething(Object obj) {
if (obj.getClass().isArray()) {
System.out.println("It's an array");
} else {
System.out.println("It's not an array");
}
}
ところで、getClass()
自体は、反射の一部ではない - それは直接的(クラス)のオブジェクトを返す簡単な方法です。ただし、getClass()
から返されたクラスオブジェクトは、リフレクション(java.lang.reflect
パッケージを参照)とともに使用して、クラスに関する興味深いことをたくさん見つけることができます。
"何もありません"という点を除いて、どの反射コードでも** **中央型の型を返します。 –
@Joachim Sauer OK - そうです。それは一番上のものだった。私は私の投稿を気にしました:) – Bohemian
Class
オブジェクトをリフレクションに使用することも、クラスレベルのものに関するデータを保持するためのマップへのキーなど、他のオブジェクトに使用することもできます。
たとえば、静的状態&のクラスを作成して、オブジェクトをインスタンス化したり統計を収集したりすることができます。実際には、あなたはすべて同じことをし、すべてが同じように動作するように思われるいくつかのクラスを持つことができ、したがって収束の可能性があります。クラスは静的なので、クラスからいくつかの状態へのマッピングと、その状態の操作が自然にあります。
したがって、静的クラスから共通コードを抽出し、すべてのメソッドを提供するクラスに入れて、Class
引数を追加して、後続操作で使用する必要がある状態を指定できます。
私のアプリケーションでは、私はすべてのクラスを知っています。では、このメソッドを使用する実際の目的は何ですか?
今、あなたはClass
オブジェクト上で動作するシステムを持っていることを、あなたはそれは、そのようなアプリケーションで使用することを決定したサードパーティのライブラリとして、あなたが所有していないことをオブジェクトに与えることができ、あなたがすることができます実行時にそれを行う!
のJavaDoc状態:
返されたClassオブジェクトが表すクラスの
static synchronized
方法でロックされているオブジェクトです。
あなたのクラスはJVMがメソッドのロックを置くためにgetClass()
を使用していますstatic synchronized
方法を、持っている場合は、を意味します。
JVMが実際にこの目的のためにgetClass()を呼び出すという証拠はありません。それは可能性が高いようだが、それはJavadocによって暗示されていない。 – EJP
@EJB - 引用されたjavadocテキストは、**明示的な非カテゴリ文**です。これはJVMが行うことです。引用に使用されている言語には「多分/おそらくない」ための余地はありません。 –
時々、オブジェクトにClass
インスタンスが必要です。私たちは、インタフェースに対してをプログラムが、今の実装の実際の型する必要がありますように:私たちはjava.lang.Object
にgetClass()
を必要とする理由
List<?> someListImplementation = geListMagically();
System.out.println(someListImplementation.getClass().getName());
は、ここで簡単な例です:
Object obj = "A String";
System.out.println(obj.getClass().getName()); // calls Object#getClass()
// and prints java.lang.String :)
しかし、私のアプリケーションでは、私は私のクラスのすべてを知っている。では、このメソッドを使用する実際の目的は何ですか?
これを書いても、things[0]
の本当のクラスが何であるかはまだ分かりますか?
Object[] things = new Object[]{
"Hi mum", new Integer(42), /* and a whole bunch more */};
shuffle(things);
は理論的には、あなたはinstanceof
式に長いシリーズを使用してthings[0]
のクラスを仕事ができるが、それは痛いです。これは問題を解決します。今
Class cls = things[0].getClass();
、私はあなたががしばしばこの種のものを行う必要はありませんことを許可します。しかし、あなたがそうするとき、Object.getClass()
の機能は、ほとんど不可欠です。
また、他の答えとして、getClass()
メソッドは、静的型付けの制限を回避するためにリフレクションを使用するアプリケーションにとって非常に重要です。私は推測
は、他の質問はObject.getClass()
方法の存在はJVMのパフォーマンスに与える影響を持っているかどうかです。その答えは、instanceof
演算子を実装するためには、必ず存在していなければならない情報のみを公開することです。そして、この情報は、ガベージコレクタによって使用される、通常です。
ちょっと見て、彼は人生と宇宙とすべての質問と答えに答えた! – medopal
私はmedopalが[42](http://en.wikipedia.org/wiki/Phrases_from_The_Hitchhiker%27s_Guide_to_the_Galaxy#Answer_to_the_Ultimate_Question_of_Life.2C_the_Universe.2C_and_Everything_.2842.29)へのあなたの参照を楽しんだと思います。私はそれが否定的な意味ではないと思う。ああ、+1、BTW(いい答えではない42のために)。 – Heinzi
@medopal - 私の謝罪...私は時には終わりに少し "遅い" –
あなたの目的で使用することがあります。
Constructor[] constructors = this.getClass().getConstructors()
- は、クラスのフィールドを取得する(反射):
-
Field[] fields = this.getClass().getFields();
- に代わりのinstanceofのそれを使用する(hereに説明したように)同じメソッドのsymetry契約をperserveする方法に等しく
if (obj == null) return false; if (getClass() != obj.getClass()) return false;
- 1. 配列スカラ2.9.1で[java.lang.ObjectでのNothing]が必要
- 2. ジェネリック型コレクションでは、オーバーライドされた等価メソッドでgetClassをチェックする必要がありますか?
- 3. javaオブジェクトgetClass()メソッドがnullを返す
- 4. javaのfinalizeメソッドが必要ですか?
- 5. getClass()。getResourceメソッドが動作しない
- 6. Java:メソッドのgetClass()が壊れていますか?
- 7. なぜDataBind()メソッドが必要ですか?
- 8. ユニバーサルウィンドウアプリ、メソッド名が必要ですか?
- 9. なぜContinueWithメソッドが必要ですか?
- 10. なぜBuffer.isBufferメソッドが必要ですか?
- 11. 誰かが私にjavaの.getClass()メソッドを説明できますか?
- 12. カスタムジェネリッククラス、メソッド名が必要です
- 13. DoWorkEventHandler "メソッド名が必要です"
- 14. Ionic platform.ready()メソッドが必要です
- 15. Falcorの `call`メソッドが必要です。良い例ですか?
- 16. includeFile()メソッドは必要ですか?
- 17. すべてのクラスにtoStringメソッドが必要ですか?
- 18. NHibernate 3.2 - すべてのプロパティに "set"メソッドが必要ですか?
- 19. loadClassメソッドでfindLoadedClassメソッド呼び出しが必要なのはなぜですか?
- 20. CustomFieldSerializerに静的メソッドが必要なのはなぜですか?
- 21. このメソッドにはrefキーワードが必要ですか?
- 22. メソッドに戻り値が必要なのはなぜですか?
- 23. 静的変数へのアクセスにgetClass()メソッドを使用できますか?
- 24. ResponseEntityがjava.lang.Objectを返す
- 25. メソッドのワーキングネームのアドバイスが必要
- 26. hashCodeとequalsメソッドをcompareToメソッドでオーバーライドする必要がありますか?
- 27. ジェネリッククラスのgetClass()
- 28. 無効にした後、.NET Control.Updateメソッドが必要ですか?
- 29. jQuery 1.7 .on()メソッド、なぜそれが必要ですか?
- 30. メソッドaddMouseListenerにスーパーが必要ない理由は何ですか?
この質問は –