web-dev-qa-db-ja.com

Javaのクラスリテラルとは何ですか?

Javaチュートリアル から:

最後に、class literalと呼ばれる特別な種類のリテラルもあります。これは、型名を取得し、「.class"; 例えば、 String.class。これは、型自体を表す(Class型の)オブジェクトを指します。

このリテラルをどのタイプの変数に割り当てることができますか?

可能であれば、小さな例を挙げてください。

54
gameover
Class<String> c = String.class;

Javadoc for Java.lang.Class これらの小さな男の1人でできることを確認する-主にリフレクションに関連する

48

それを理解するには、StringがクラスClassのインスタンス(オブジェクト)であることを理解する必要があります。文字列リテラル(例: "I am a string。")は、クラス(Stringのインスタンス(オブジェクト)を表す表記法です。一方、クラスリテラル(Hashtable.classなど)は、クラスのインスタンスクラス

37
shinkou

ここの他の良い答えのおかげで、あなたはそれが何であるかを知っていますが、これも明確にするかもしれない典型的な使用例です:

_    private static Logger log = Logger.getLogger(YourClassHere.class);
_

コードが示すように、これはロギングフレームワークを初期化する行です(この例では、_org.Apache.log4j_パッケージを使用していますが、原則は他のフレームワークにも拡張されます)。 getLogger()メソッドには、クラスリテラルが必要なため、ログの内容(つまり、現在のオブジェクトのクラス)がわかります。

22
Ben

JLS による

15.8.2クラスリテラル

クラスリテラルは、クラス名、インターフェイス名、配列名、またはプリミティブ型の後に.とトークンclassが続く式です。クラスリテラルのタイプはClassです。現在のインスタンスのクラスの定義クラスローダーによって定義された名前付きタイプ(またはvoid)のClassオブジェクトに評価されます。

11
stacker

いくつかの一般的な使用法は、 Runtime-Type Tokens としてのクラスリテラルにあります。

5
trashgod

リテラル自体はMyClassです。 _MyClass.class_と書くと、クラスオブジェクトへの参照が得られます。 new MyClass()と記述すると、リテラルを使用して、_MyClass.class_で取得したクラスオブジェクトのインスタンスを取得します。インスタンスから、myClassInstance.getClass()を呼び出すことにより、同じクラスオブジェクトを取得します。

100%確実ではありませんが、リテラル自体を変数に割り当てることはできません。できることは、クラスの名前を文字列として取得し、リフレクションフレームワークを使用してインスタンスを作成することです。

4
bertolami

例では、そのようなものです:

Class myClass = MyClass.class

または

MyClass.class.getResourceAsStream("config.properties");
2
PeterMmm

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
1
eosimosu

それを理解するには、Stringがそのinstance (object)Objectsuperclass (parent class)であることを理解する必要があります。

_class String_のinstance (object)の値は_String literal_です(例_"I am a string."_):

_class   |  instance (object) |  literal
------------------------------------------------
String  |  instance_name  =  |  "I am a string."
_

一方、_class Object_のinstance (object)の値は_Class literal_ —(たとえば_Hashtable.class_のinstance (object)を参照する_class Hashtable_)

_class      |  instance (object) |  literal
------------------------------------------------
Hashtable  |  instance_name     |  Hashtable.
_
1
AppTime