Javaで.class
はどういう意味ですか?たとえば、Print
というクラスを作成した場合。 Print.class
は何を返しますか?
クラス名の後に.class
を記述すると、クラスリテラル- Java.lang.Class
情報を表すオブジェクトaboutを参照します。
たとえば、クラスがPrint
の場合、Print.class
は実行時にクラスPrint
を表すオブジェクトです。これは、Print
の(直接)インスタンスのgetClass()
メソッドによって返されるものと同じオブジェクトです。
Print myPrint = new Print();
System.out.println(Print.class.getName());
System.out.println(myPrint.getClass().getName());
.classは、使用可能なクラスのインスタンスがない場合に使用されます。
。getClass()は、使用可能なクラスのインスタンスがある場合に使用されます。
object.getClass()は、指定されたオブジェクトのクラスを返します。例えば:
String string = "hello";
System.out.println(string.getClass().toString());
これは出力されます
class Java.lang.String
これは文字列オブジェクトのクラスです:)
オブジェクトのインスタンスが利用できる場合、そのクラスを取得する最も簡単な方法はObject.getClass()
を呼び出すことです
.class
構文
タイプは利用できるがインスタンスが存在しない場合は、タイプの名前に.class
を追加することでクラスを取得できます。これは、プリミティブ型のクラスを取得する最も簡単な方法でもあります。
boolean b;
Class c = b.getClass(); // compile-time error
Class c = boolean.class; // correct
明確にするために、この「.class」メソッドは、Javaコードのコンパイル後に表示されるバイトコードファイルや、OOP理論のクラスとオブジェクトの概念間の混乱を参照していません。
この '.class'メソッドは、コードのリフレクションのためにJavaで使用されます。通常、完全修飾クラス名、定数のリスト、パブリックフィールドのリストなど、クラスのメタデータを収集できます。
すべての詳細を取得するには、これらのリンク(既に上記)を確認してください。
https://docs.Oracle.com/javase/tutorial/reflect/class/classNew.html
https://docs.Oracle.com/javase/8/docs/api/Java/lang/Class.html
通常、プロジェクトの構築を開始するときにすぐにReflectionを使用する予定はありません。すでに動作しているコードを管理しようとした後に必要なことがわかっているものです。多くの場合、プログラムの複数のインスタンスを管理するために必要です。特定の「クローン」をそれぞれ特定して、何かが既に定義されているかどうかを確認したり、関数の数をカウントしたり、単にクラスの特定のインスタンスの詳細を記録したりすることができます。
使用可能なインスタンスがない場合は、.class
構文を使用してクラスに対応するClassオブジェクトを取得します。それ以外の場合は、getClass()メソッドを使用してClassオブジェクトを取得できます。プリミティブデータ型のインスタンスがないため、プリミティブデータ型には.class
構文を使用する必要があります。
package test;
public class Test {
public static void main(String[] args)
{
//there is no instance available for class Test, so use Test.class
System.out.println("Test.class.getName() ::: " + Test.class.getName());
// Now create an instance of class Test use getClass()
Test testObj = new Test();
System.out.println("testObj.getClass().getName() ::: " + testObj.getClass().getName());
//For primitive type
System.out.println("boolean.class.getName() ::: " + boolean.class.getName());
System.out.println("int.class.getName() ::: " + int.class.getName());
System.out.println("char.class.getName() ::: " + char.class.getName());
System.out.println("long.class.getName() ::: " + long.class.getName());
}
}
ここでの鍵は、クラスとオブジェクトの違いを理解することだと思います。オブジェクトはクラスのインスタンスです。しかし、完全なオブジェクト指向言語では、クラスもオブジェクトです。そのため、.class
を呼び出すと、そのクラスのClassオブジェクトへの参照が取得され、その後操作できます。
クラスリテラルは、クラス、インターフェイス、配列、またはプリミティブ型の名前、または擬似型voidで構成され、その後に「。」が続く式です。トークンクラス。 JDK 5.0の変更点の1つは、クラスJava.lang.ClassがJava.lang.Class Class<T>
ジェネリックであるということです。したがって、
Class<Print> p = Print.class;
ここでの参照:
https://docs.Oracle.com/javase/7/docs/api/Java/lang/Class.html
http://docs.Oracle.com/javase/tutorial/extra/generics/literals.html
http://docs.Oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.8.2