2011-09-13 4 views

答えて

6

あなたはReflectionの素晴らしい世界に向かっています。リフレクションを使用すると、プログラムでクラスを検査したり、フィールドを設定したり、メソッドを呼び出すことができます。これは本当に強力なものです。毎日使用するほとんどのフレームワーク(Hibernate、Spring、Guiceなど)物事を起こすために非常に重く依存しています。

+4

非常に便利です良い概観。しかし、*フレームワーク*で素晴らしいことができますが、古典的なビジネスコードでは、コード構造を判読不能にすることが簡単にできるので、通常はそれを避けるべきです。 –

+2

getClassは通常、equalsメソッドをオーバーライドするときにビジネス・コードで使用され、他のオブジェクトのクラスがこのオブジェクトのクラスと同じであることをチェックします。 –

2

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パッケージを参照)とともに使用して、クラスに関する興味深いことをたくさん見つけることができます。

+9

"何もありません"という点を除いて、どの反射コードでも** **中央型の型を返します。 –

+0

@Joachim Sauer OK - そうです。それは一番上のものだった。私は私の投稿を気にしました:) – Bohemian

1

Classオブジェクトをリフレクションに使用することも、クラスレベルのものに関するデータを保持するためのマップへのキーなど、他のオブジェクトに使用することもできます。

たとえば、静的状態&のクラスを作成して、オブジェクトをインスタンス化したり統計を収集したりすることができます。実際には、あなたはすべて同じことをし、すべてが同じように動作するように思われるいくつかのクラスを持つことができ、したがって収束の可能性があります。クラスは静的なので、クラスからいくつかの状態へのマッピングと、その状態の操作が自然にあります。

したがって、静的クラスから共通コードを抽出し、すべてのメソッドを提供するクラスに入れて、Class引数を追加して、後続操作で使用する必要がある状態を指定できます。

私のアプリケーションでは、私はすべてのクラスを知っています。では、このメソッドを使用する実際の目的は何ですか?

今、あなたはClassオブジェクト上で動作するシステムを持っていることを、あなたはそれは、そのようなアプリケーションで使用することを決定したサードパーティのライブラリとして、あなたが所有していないことをオブジェクトに与えることができ、あなたがすることができます実行時にそれを行う!

1

のJavaDoc状態:

返されたClassオブジェクトが表すクラスのstatic synchronized方法でロックされているオブジェクトです。

あなたのクラスはJVMがメソッドのロックを置くためにgetClass()を使用していますstatic synchronized方法を、持っている場合は、を意味します。

+0

JVMが実際にこの目的のためにgetClass()を呼び出すという証拠はありません。それは可能性が高いようだが、それはJavadocによって暗示されていない。 – EJP

+1

@EJB - 引用されたjavadocテキストは、**明示的な非カテゴリ文**です。これはJVMが行うことです。引用に使用されている言語には「多分/おそらくない」ための余地はありません。 –

1

時々、オブジェクトにClassインスタンスが必要です。私たちは、インタフェースに対してをプログラムが、今の実装の実際の型する必要がありますように:私たちはjava.lang.ObjectgetClass()を必要とする理由

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 :) 
11

しかし、私のアプリケーションでは、私は私のクラスのすべてを知っている。では、このメソッドを使用する実際の目的は何ですか?

これを書いても、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演算子を実装するためには、必ず存在していなければならない情報のみを公開することです。そして、この情報は、ガベージコレクタによって使用される、通常です。

+0

ちょっと見て、彼は人生と宇宙とすべての質問と答えに答えた! – medopal

+0

私は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

+0

@medopal - 私の謝罪...私は時には終わりに少し "遅い" –

1

あなたの目的で使用することがあります。

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; 
    
関連する問題