Javaチュートリアルから:
最後に、クラス リテラルと呼ばれる特別な種類のリテラルもあり、型名を取り、"
.class
" を追加して形成されます。たとえば、String.class
.Class
これは、型自体を表す(型の) オブジェクトを参照します。
このリテラルはどの型の変数に代入できますか?
可能であれば、小さな例を挙げてください。
Javaチュートリアルから:
最後に、クラス リテラルと呼ばれる特別な種類のリテラルもあり、型名を取り、"
.class
" を追加して形成されます。たとえば、String.class
.Class
これは、型自体を表す(型の) オブジェクトを参照します。
このリテラルはどの型の変数に代入できますか?
可能であれば、小さな例を挙げてください。
Class<String> c = String.class;
Javadoc をjava.lang.Class
チェックして、これらの小さな男の 1 つで何ができるかを確認してください。主にリフレクションに関連しています。
それを理解するには、 StringがクラスClassのインスタンス (オブジェクト) であることを理解する必要があります。文字列リテラル (例: "I am a string.") はクラスStringのインスタンス (オブジェクト) を表す表記法ですが、クラス リテラル (例: Hashtable.class) はクラスClassのインスタンスを表す表記法です。
ここにある他の良い回答のおかげで、それが何であるかはわかりますが、これも明確になる典型的な使用例です。
private static Logger log = Logger.getLogger(YourClassHere.class);
コードが示すように、これはロギング フレームワークを初期化する行です (この例では、org.apache.log4j
パッケージを使用していますが、原則は他のフレームワークにも適用されます)。このgetLogger()
メソッドにはクラス リテラルが必要なので、何をログに記録しているか (つまり、現在のオブジェクトのクラス) がわかります。
Java言語仕様(JLS)によると:
15.8.2クラスリテラル
クラスリテラルは、クラス、インターフェイス、配列、またはプリミティブ型の名前と、それに続くa
.
およびトークンで構成される式class
です。クラスリテラルの型はですClass
。void
これは、現在のインスタンスのクラスの定義クラスローダーによって定義された名前付きタイプ(または)のClassオブジェクトに評価されます。
いくつかの一般的な使用法は、ランタイム タイプ トークンとしてのクラス リテラルに見られる場合があります。このアプローチは、ここで説明するに見られるように、オブザーバー パターンを実装するために広く使用されています。アプリケーションには、例が含まれています。EventListenerList
Converter
ConverterRangeModel
リテラル自体はMyClass
です。書くMyClass.class
と、クラスオブジェクトへの参照が得られます。を書くnew MyClass()
と、リテラルを使用して、によって取得したクラスオブジェクトのインスタンスを取得しMyClass.class
ます。インスタンスから、を呼び出すことで同じクラスオブジェクトを取得しますmyClassInstance.getClass()
。
100%確信はありませんが、リテラル自体を変数に割り当てることはできません。できることは、クラスの名前を文字列として取得し、リフレクションフレームワークを使用してインスタンスを作成することです。
例では、次のようなものです。
Class myClass = MyClass.class
また
MyClass.class.getResourceAsStream("config.properties");
JVM がアプリケーション クラスをロードするとき、それらをjava.class.Class
オブジェクトとして保存します。
Class
そのため、通常、クラスを表す型のインスタンスがメモリ内にいくつか存在します。したがって、次のようなことができます。
Class<Bicycle> bicycleClass = Bicycle.class; // returns the object storing your Bicycle class
bicycleClass.getName(); // returns your class name
bicycleClass.getDeclaredMethods(); // returns your (declared) class methods
それを理解するにString
は、それが のinstance (object)
であることを理解する必要がありますsuperclass (parent class)
Object
。
class String
のinstance (object)
値はString literal
(eg "I am a string."
) です:
class | instance (object) | literal
------------------------------------------------
String | instance_name = | "I am a string."
一方、class Object
のinstance (object)
値はClass literal
— (例: Hashtable.class
) であり、これは を参照しclass Hashtable
ます。instance (object)
class | instance (object) | literal
------------------------------------------------
Hashtable | instance_name | Hashtable.