Javaでの.classの意味は?


149

.classJavaで何を意味しますか?たとえば、というクラスを作成したとしPrintます。何がPrint.class戻りますか?



質問の内容がよくわかりません。もう少し詳しく説明していただければ、誰かがもっと役立つ情報を提供してくれるかもしれません
Paul Walker

28
これは確かに私にとって本当の質問のように見えます。私はこの質問を私自身に尋ねていたところ、Googleですばやく検索した後、自分自身をここに見つけました。私の質問が本物ではないことを知っていれば、私は気にならなかったと思います!
ジョーンズ博士

1
また、特定の検索文字列は扱いにくいため、この質問について書かれたり見つけたりすることはほとんどありません。上記にリンクされているAPIドキュメント以外では、この表記法が他の場所で言及されているのを見たことがありません(リフレクションで使用されることはよくあります)。
jordanpg 2014年

2
@MadProgrammer OPは、偶然にファイル名拡張子に.classのみ関連する構文について尋ねています.class
jordanpg 2014年

回答:


143

あなたが書くとき.class-クラス名の後に、それはクラスリテラルを参照する java.lang.Class情報を表すオブジェクトについての特定のクラスを。

たとえば、クラスがのPrint場合、Print.classPrint実行時のクラスを表すオブジェクトです。これは、のgetClass()(直接の)インスタンスのメソッドによって返されるオブジェクトと同じですPrint

Print myPrint = new Print();
System.out.println(Print.class.getName());
System.out.println(myPrint.getClass().getName());

2
クラスオブジェクトでできることは何ですか?
ケビン

7
@Kevin java.lang.ClassのAPIドキュメントを参照してください。
パトリシアシャナハン2013

アプリケーション:プライベートフィールドへのアクセスWriter.class.getDeclaredField("writeBuffer")。例:
jordanpg 2014年

2
それで、タイプはPrint.class何ですか?
Zhipeng YANG

1
Androidはどのように処理しnew Intent(this, Activity.classますか?class Activity各クラスを比較して見つけようとしますか?
Zhipeng YANG

56

.class 使用可能なクラスのインスタンスがない場合に使用されます。

.getClass() 使用可能なクラスのインスタンスがある場合に使用されます。

object.getClass() 指定されたオブジェクトのクラスを返します。

例えば:

String string = "hello";
System.out.println(string.getClass().toString());

これは出力します:

class java.lang.String

これは文字列オブジェクトのクラスです:)


7
getClass()クラスのオブジェクトを指す参照がある場合にのみ役立ちます。ClassName.classクラスにインスタンスがない場合でも使用できます。たとえば、を検討してくださいMath.class。それぞれが特定の状況に適しています。
パトリシアシャナハン2013

素晴らしい説明。右あなたが間の区別を識別する方法it.Loveのポイントへ.class.getClass().
Sevastyan Savanyuk

6

オブジェクトのインスタンスが利用可能な場合、そのクラスを取得する最も簡単な方法は、 Object.getClass()

.class構文

タイプが利用可能であるがインスタンスがない場合.class、タイプの名前に追加することによりクラスを取得することが可能です。これは、プリミティブ型のクラスを取得する最も簡単な方法でもあります。

boolean b;
Class c = b.getClass();   // compile-time error

Class c = boolean.class;  // correct

参照:クラスについてのdocs.oracle.com


6

明確にするために、この「.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を使用する予定はありません。これは、すでに機能しているコードを管理しようとした後で必要になることです。多くの場合、プログラムの複数のインスタンスを管理するためにそれが必要です。おそらく、何か特定の「クローン」を識別して、何かがすでに定義されているかどうかを判断したり、関数の数をカウントしたり、単にクラスの特定のインスタンスの詳細をログに記録したりすることができます。


3

使用可能なインスタンスがない場合は、.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());
       }
    }

1

ここでの鍵は、クラスとオブジェクトの違いを理解することだと思います。オブジェクトはクラスのインスタンスです。しかし、完全にオブジェクト指向の言語では、クラスはオブジェクトでもあります。したがって、呼び出し.classはそのClassのClassオブジェクトへの参照を取得し、それを操作できます。


4
in a fully object-oriented language, a Class is also an Object?<引用が必要>
Sam Dufel 14

0

クラスリテラルは、クラス、インターフェイス、配列、プリミティブ型の名前、または擬似型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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.