[解決済み] Javaクラスにおけるcanonical name、simple name、class nameの違いは何ですか?
2022-03-19 09:35:16
質問
Javaでは、これらの違いは何ですか。
Object o1 = ....
o1.getClass().getSimpleName();
o1.getClass().getName();
o1.getClass().getCanonicalName();
何度もJavadocを確認したのに、これでは決してうまく説明できない。 また、テストを実行しましたが、これらのメソッドが呼び出される方法の背後にある本当の意味は反映されませんでした。
解決するには?
何かわからないことがあったら、まずテストを書いてみてください。
私はこうしました。
class ClassNameTest {
public static void main(final String... arguments) {
printNamesForClass(
int.class,
"int.class (primitive)");
printNamesForClass(
String.class,
"String.class (ordinary class)");
printNamesForClass(
java.util.HashMap.SimpleEntry.class,
"java.util.HashMap.SimpleEntry.class (nested class)");
printNamesForClass(
new java.io.Serializable(){}.getClass(),
"new java.io.Serializable(){}.getClass() (anonymous inner class)");
}
private static void printNamesForClass(final Class<?> clazz, final String label) {
System.out.println(label + ":");
System.out.println(" getName(): " + clazz.getName());
System.out.println(" getCanonicalName(): " + clazz.getCanonicalName());
System.out.println(" getSimpleName(): " + clazz.getSimpleName());
System.out.println(" getTypeName(): " + clazz.getTypeName()); // added in Java 8
System.out.println();
}
}
プリントする。
int.class (primitive):
getName(): int
getCanonicalName(): int
getSimpleName(): int
getTypeName(): int
String.class (ordinary class):
getName(): java.lang.String
getCanonicalName(): java.lang.String
getSimpleName(): String
getTypeName(): java.lang.String
java.util.HashMap.SimpleEntry.class (nested class):
getName(): java.util.AbstractMap$SimpleEntry
getCanonicalName(): java.util.AbstractMap.SimpleEntry
getSimpleName(): SimpleEntry
getTypeName(): java.util.AbstractMap$SimpleEntry
new java.io.Serializable(){}.getClass() (anonymous inner class):
getName(): ClassNameTest$1
getCanonicalName(): null
getSimpleName():
getTypeName(): ClassNameTest$1
最後のブロックには空のエントリがあり、ここで
getSimpleName
は空の文字列を返します。
これを見たアップショットは
- その 名前 は、クラスを動的に読み込むために使用する名前で、例えば、以下のように呼び出します。
Class.forName
で、デフォルトのClassLoader
. の範囲内で、あるClassLoader
は、すべてのクラスが一意な名前を持つ。- その 正規名 はimport文の中で使われる名前です。これは
toString
またはロギング操作。このときjavac
コンパイラはクラスパスを完全に把握しており、コンパイル時に完全修飾クラス名とパッケージ名を衝突させることで、クラスパス内の標準的な名前の一意性を強制しています。しかし、JVMはこのような名前の衝突を受け入れなければならないため、標準的な名前では、クラスパス内のクラスを一意に識別できません。ClassLoader
. (今にして思えば、このゲッターのより良い名称はgetJavaName
しかし、このメソッドは、JVMがJavaプログラムを実行するためだけに使用されていた時代から存在しています)。- その 単純な名前 はクラスを大まかに識別します。
toString
やロギング操作を行うことができますが、一意であることは保証されません。- その 型名 は、"この型の名前を表す情報文字列を返します" のようなものです。
toString
これは純粋に情報提供であり、契約上の価値を持ちません" 。(sir4ur0nの記述による)
また、この種の技術的なJava APIの詳細については、一般的にJava Language Specificationのドキュメントを参照することができます。
<ブロッククオート-
ここでは
Java 11
仕様書 この件に関して https://docs.oracle.com/javase/specs/jls/se11/html/jls-6.html#jls-6.7
Example 6.7-2.
と
Example 6.7-2.
を超える
Fully Qualified Names
と
Fully Qualified Names v. Canonical Name
それぞれ
関連
-
Spring boot runs with Error creating bean with name 'entityManagerFactory' defined in class path resource
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] Java内部クラスと静的ネストされたクラス
-
[解決済み] StringBuilderとStringBufferの違いについて
-
[解決済み] wait()とsleep()の違いについて
-
[解決済み] JDKとJREの違いは何ですか?
-
[解決済み] JavaにおけるSoftReferenceとWeakReferenceの違いは何ですか?
-
[解決済み] Javaにおける==とequals()の違いは何ですか?
-
[解決済み】JSF、Servlet、JSPの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
スタイルが読み込まれず、ブラウザのコンソールでエラーが報告される。リソースはスタイルシートとして解釈されますが、MIMEタイプtext/htmlで転送されます。
-
IllegalArgumentException この例外を解決する方法
-
SpringBootApplication を型解決できない。
-
Dateが型に解決できない問題を解決する
-
プロローグでのコンテンツは禁止されています
-
JQuery DataTable 详解
-
Eclipseプロンプトを実行する java仮想マシンを使用しない
-
javaコンパイル時のエラー:不正な文字 '\ufeff' に対する解決策です。
-
mavenプロジェクトのテストエラー java.lang.ClassNotFoundException: org.glassfish.jersey.client.ClientConfig の問題を解決する。
-
java -serverコマンドで「Error: no `server' JVM at ... jvm.dll」を解決する方法です。