Java Class
=のドキュメントは次のとおりです。
Class
オブジェクトは、クラスがロードされるときにJava Virtual Machine)によって、およびクラスローダーのdefineClass
メソッドの呼び出しによって自動的に構築されます。
これらのClass
オブジェクトとは何ですか? new
を呼び出してクラスからインスタンス化されたオブジェクトと同じですか?
また、たとえばobject.getClass().getName()
は、Java.lang.Class
を継承しなくても、すべてをスーパークラスClass
に型キャストできますか?
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
オブジェクトがあり、そのオブジェクトにはメタデータが含まれ、実行時にアクセスできます。
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パッケージに含まれるクラス、フィールド、メソッドなどのクラスを使用すると、定義済みのクラス、メソッド、フィールドを分析し、それらの新しいインスタンスを作成し、他のすべての種類のメソッドを呼び出すことができますまた、実行時に動的にこれを行うことができます。
getClass()
は、returnsJava.lang.Class
...のインスタンスであるオブジェクトです。キャストは含まれません。キャストは次のようになります。
Class<?> type = (Class<?>) object;
また、同じタイプのインスタンスに対してgetClassがsame objectを返すというColinDの回答に追加したいと思います。これはtrueを出力します:
MyOtherClass foo = new MyOtherClass();
MyOtherClass bar = new MyOtherClass();
System.out.println(foo.getClass()==bar.getClass());
equalsではなく、==を使用していることに注意してください。
Classオブジェクトは、Class(Java.lang.Class)のインスタンスです。クラスのjavadocから引用した以下の質問に答えてください
クラスにはパブリックコンストラクターがありません。代わりに、Classオブジェクトは、クラスがロードされるときにJava Virtual Machineによって、およびクラスローダーのdefineClassメソッドの呼び出しによって自動的に構築されます。
Objectクラスは、Javaのデフォルトのすべてのクラスの親クラスです。つまり、Javaの最上位クラスです。
Objectクラスは、タイプがわからないオブジェクトを参照する場合に役立ちます。親クラス参照変数は、アップキャストと呼ばれる子クラスオブジェクトを参照できることに注意してください。
例を見てみましょう。オブジェクトを返すgetObject()メソッドがありますが、Employee、Studentなどの任意のタイプを使用できます。Objectクラス参照を使用して、そのオブジェクトを参照できます。例えば:
Object obj=getObject()
; //このメソッドから返されるオブジェクトがわかりません
クラスオブジェクトを完全に理解するために、最初にクラスオブジェクトを取得することをもう一度理解してください。作成するすべての_.Java
_ファイルを見ると、その_.Java
_ファイルをコンパイルすると、jvmは_.class
_ファイルを作成します。このファイルには、クラスに関するすべての情報、つまり:
上記のリストは、典型的なクラスで通常見られるものです。これで、実際にクラスを使用する必要がある場合(つまり、main()
メソッドでコードを実行する場合)、_.Java
_ファイルと__.class
_ファイルがハードディスクに存在します。ハードドライブの_.class
_ファイルを使用し、jvmの5つのメモリ領域の1つ(メソッド領域)にロードします。_.class
_ファイルをメソッド領域にロードした直後に、jvmはその情報と表すヒープメモリ領域に存在するクラス。
これがトップレベルのビューです
_.Java
_ --compile-> _.class
_->スクリプトを実行すると-> _.class
_はメソッド領域にロードされます--jvmはメソッド領域からクラスオブジェクトを作成します->クラスオブジェクトが生まれます
クラスオブジェクトを使用すると、クラス名、メソッド名など、クラスに関するすべての情報を取得できます。
また、覚えておく必要があるのは、スクリプトで使用するクラスごとにクラスオブジェクトが1つだけであることです。
これが理にかなっていることを願って