3

Java では、次のコードを記述できます。

Class<?> stringClass = String.class;

ランタイムは、タイプ java.lang.String クラスを表す Class インスタンスへの参照を割り当てます。

私の質問は次のとおりです。

  1. Class インスタンスが Java 型ごとにシングルトンであることは、JVM によって保証されていますか?
  2. #1 に対する答えが true の場合 - Class インスタンスが作成されているのはいつですか? (-クラスローダが最初に Java タイプをロードするときに、または多分getClass()呼び出します。)Type.class
  3. を呼び出すときに内部で何が起こるかType.classclassもちろん、コードで呼び出される静的メンバーがないため、私は尋ねています。
4

2 に答える 2

1

Foo.classは、少なくとも javac7 では、定数プールの単純なルックアップにコンパイルされているようです。したがってFoo.class、このクラスがロードされるときにロードされる可能性があります。

古いバージョンの Java には当てはまらないことを覚えています。Foo.classのようなものにコンパイルされClass.forName("Foo")、ロードはかなり怠惰でオンデマンドでした。

于 2013-06-12T20:17:16.113 に答える
1
  1. この質問によると、Classオブジェクトが 1 つしかない場合、タイプごとのオブジェクトは一意ですClassLoader。異なる と、同じクラス定義に対してClassLoaders異なるオブジェクトが生成される可能性があります。Class
  2. Classクラスが によってロードされた ClassLoaderとき、通常はクラスが最初に参照されたときに、オブジェクトが作成されます。
  3. Java 言語仕様によると、セクション 15.8.2クラス リテラルType.classであるため、何も呼び出されません。クラス リテラルはオブジェクトを参照します。Class

上記のリンクのセクションから JLS を引用します。

クラス リテラルは、クラス、インターフェイス、配列、またはプリミティブ型の名前、または疑似型 void の後に「.」が続く式です。そしてトークンクラス。

クラス リテラルは、現在のインスタンスのクラスの定義クラス ローダー (§12.2) によって定義されているように、指定された型 (または void) の Class オブジェクトに評価されます。

于 2013-06-12T19:49:52.497 に答える