web-dev-qa-db-ja.com

Classオブジェクト(Java.lang.Class)とは何ですか?

Java Class =のドキュメントは次のとおりです。

Classオブジェクトは、クラスがロードされるときにJava Virtual Machine)によって、およびクラスローダーのdefineClassメソッドの呼び出しによって自動的に構築されます。

これらのClassオブジェクトとは何ですか? newを呼び出してクラスからインスタンス化されたオブジェクトと同じですか?

また、たとえばobject.getClass().getName()は、Java.lang.Classを継承しなくても、すべてをスーパークラスClassに型キャストできますか?

71
Carbonizer

Classに型キャストされるものはありません。すべてのObject in Javaは特定のclassに属します。そのため、他のすべてのクラスに継承されるObjectクラスは、 getClass()メソッド。

getClass()、またはクラスリテラル-_Foo.class_は、クラスに関するメタデータを含むClassオブジェクトを返します。

  • 名前
  • パッケージ
  • 方法
  • コンストラクター
  • 注釈

キャストやさまざまなチェック(isAbstract()isPrimitive()など)などの便利なメソッド。 javadoc は、クラスについて取得できる情報を正確に示します。

したがって、たとえば、yoursのメソッドにオブジェクトが与えられ、_@Processable_アノテーションが付けられている場合に処理する場合、次のようにします。

_public void process(Object obj) {
    if (obj.getClass().isAnnotationPresent(Processable.class)) {
       // process somehow; 
    }
}
_

この例では、指定されたオブジェクトのクラスに関するメタデータ(それが何であれ)を取得し、指定された注釈があるかどうかを確認します。 Classインスタンスのメソッドの多くは、「反射操作」または単に「リフレクション」と呼ばれます。 こちらをお読みください リフレクション、その理由と使用時期について。

また、Classオブジェクトは、実行中のJavaアプリケーションのクラスとともに列挙型およびインターフェイスを表し、それぞれのメタデータを持っていることに注意してください。

要約すると、Java)の各オブジェクトにはクラスがあり(クラスに属し)、それぞれのClassオブジェクトがあり、そのオブジェクトにはメタデータが含まれ、実行時にアクセスできます。

86
Bozho

Classオブジェクトは、オブジェクトのクラスを記述する一種のメタオブジェクトです。主にJavaのリフレクション機能で使用されます。実際のクラスの「青写真」のように考えることができます。例えば。このようなクラスの車があります:

public class Car {
    public String brand;
}

次に、「Car」クラスを記述するClassオブジェクトを作成できます。

Class myCarClass = Class.forName("Car");

これで、そのClassオブジェクトのCarクラスであらゆる種類のクエリを実行できます。

myCarClass.getName() - returns "Car"
myCarClass.getDeclaredField("brand") - returns a Field object describing the "brand" field

等々。すべてのJavaオブジェクトには、Javaオブジェクトのクラスを記述するClassオブジェクトを返すメソッドgetClass()があります。したがって、次のようなことができます。

Car myCar = new Car();
Class myCarClass  = myCar.getClass();

これは、あなたが知らないオブジェクト、例えば、あなたが外部から取得するオブジェクトにも機能します:

public void tellMeWhatThisObjectsClassIs(Object obj) {
    System.out.println(obj.getClass().getName());
}

このメソッドに任意のJavaオブジェクトをフィードすると、指定したオブジェクトの実際のクラスが出力されます。

Javaを使用する場合、ほとんどの場合、Classオブジェクトについて心配する必要はありません。ただし、いくつかの便利なユースケースがあります。例えば。特定のクラスのオブジェクトをプログラムでインスタンス化できます。これは、オブジェクトのシリアル化と逆シリアル化によく使用されます(たとえば、Java XMLまたはJSONとの間でオブジェクトをやり取りする)。

Class myCarClass = Class.forName("Car");
Car myCar = myCarClass.newInstance();  // is roughly equivalent to = new Car();

また、クラスのすべての宣言されたフィールドまたはメソッドなどを見つけるために使用することもできます。これは特定の場合に非常に便利です。例えばメソッドに未知のオブジェクトが渡され、インターフェースなどを実装している場合など、それについてさらに知る必要がある場合、Classクラスはここでの友達です。

つまり、Java.lang.reflectパッケージに含まれるクラス、フィールド、メソッドなどのクラスを使用すると、定義済みのクラス、メソッド、フィールドを分析し、それらの新しいインスタンスを作成し、他のすべての種類のメソッドを呼び出すことができますまた、実行時に動的にこれを行うことができます。

41
Jan Thomä

getClass()は、returnsJava.lang.Class...のインスタンスであるオブジェクトです。キャストは含まれません。キャストは次のようになります。

Class<?> type = (Class<?>) object;
8
ColinD

また、同じタイプのインスタンスに対してgetClassがsame objectを返すというColinDの回答に追加したいと思います。これはtrueを出力します:

    MyOtherClass foo = new MyOtherClass();
    MyOtherClass bar = new MyOtherClass();
    System.out.println(foo.getClass()==bar.getClass());

equalsではなく、==を使用していることに注意してください。

5
Koray Tugay

Classオブジェクトは、Class(Java.lang.Class)のインスタンスです。クラスのjavadocから引用した以下の質問に答えてください

クラスにはパブリックコンストラクターがありません。代わりに、Classオブジェクトは、クラスがロードされるときにJava Virtual Machineによって、およびクラスローダーのdefineClassメソッドの呼び出しによって自動的に構築されます。

3
Pakka Techie

Objectクラスは、Javaのデフォルトのすべてのクラスの親クラスです。つまり、Javaの最上位クラスです。

Objectクラスは、タイプがわからないオブジェクトを参照する場合に役立ちます。親クラス参照変数は、アップキャストと呼ばれる子クラスオブジェクトを参照できることに注意してください。

例を見てみましょう。オブジェクトを返すgetObject()メソッドがありますが、Employee、Studentなどの任意のタイプを使用できます。Objectクラス参照を使用して、そのオブジェクトを参照できます。例えば:

Object obj=getObject(); //このメソッドから返されるオブジェクトがわかりません

1

クラスオブジェクトを完全に理解するために、最初にクラスオブジェクトを取得することをもう一度理解してください。作成するすべての_.Java_ファイルを見ると、その_.Java_ファイルをコンパイルすると、jvmは_.class_ファイルを作成します。このファイルには、クラスに関するすべての情報、つまり:

  1. クラスの完全修飾名
  2. クラスの親
  3. メソッド情報
  4. 可変フィールド
  5. コンストラクタ
  6. 修飾子情報
  7. コンスタントプール

上記のリストは、典型的なクラスで通常見られるものです。これで、実際にクラスを使用する必要がある場合(つまり、main()メソッドでコードを実行する場合)、_.Java_ファイルと__.class_ファイルがハードディスクに存在します。ハードドライブの_.class_ファイルを使用し、jvmの5つのメモリ領域の1つ(メソッド領域)にロードします。_.class_ファイルをメソッド領域にロードした直後に、jvmはその情報と表すヒープメモリ領域に存在するクラス。

これがトップレベルのビューです

_.Java_ --compile-> _.class_->スクリプトを実行すると-> _.class_はメソッド領域にロードされます--jvmはメソッド領域からクラスオブジェクトを作成します->クラスオブジェクトが生まれます

クラスオブジェクトを使用すると、クラス名、メソッド名など、クラスに関するすべての情報を取得できます。

また、覚えておく必要があるのは、スクリプトで使用するクラスごとにクラスオブジェクトが1つだけであることです。

これが理にかなっていることを願って

1
Brendon Cheung