1. 概要

このチュートリアルでは、 Class APIのメソッドからクラスの名前を取得する4つの方法、 getSimpleName()、getName()、getTypeName()について学習します。 getCanonicalName()。

これらのメソッドは、名前が似ていて、Javadocがやや曖昧であるため、混乱する可能性があります。 また、プリミティブタイプ、オブジェクトタイプ、内部クラスまたは匿名クラス、および配列に関しては、いくつかのニュアンスがあります。

2. 単純な名前の取得

getSimpleName()メソッドから始めましょう。

Javaには、simplequalifiedの2種類の名前があります。 単純な名前は一意の識別子で構成され、修飾された名前はドットで区切られた一連の単純な名前です。

その名前が示すように、 getSimpleName()は、基になるクラスの単純な名前、つまりソースコードで指定された名前を返します。

次のクラスを想像してみましょう。

package com.baeldung.className;
public class RetrieveClassName {}

その単純な名前はRetrieveClassNameになります。

assertEquals("RetrieveClassName", RetrieveClassName.class.getSimpleName());

プリミティブ型と配列の単純な名前を取得することもできます。 int、boolean float など、単に名前になるプリミティブ型の場合。

また、配列の場合、メソッドは配列のタイプの単純な名前に続いて、配列の各次元の開き括弧と閉じ括弧([])を返します。

RetrieveClassName[] names = new RetrieveClassName[];
assertEquals("RetrieveClassName[]", names.getClass().getSimpleName());

したがって、2次元の String 配列の場合、そのクラスで getSimpleName()を呼び出すと、 String [][]が返されます。

最後に、匿名クラスの特定のケースがあります。 匿名クラスでgetSimpleName()を呼び出すと、空の文字列が返されます。

3. 他の名前の取得

次に、クラスの名前、型名、または正規名を取得する方法を見てみましょう。 getSimpleName()とは異なり、これらの名前はクラスに関するより多くの情報を提供することを目的としています。

The getCanonicalName() メソッドは常に正規名を返します Java言語仕様で定義されているとおり。

他の方法については、ユースケースによって出力が少し異なる場合があります。 これがさまざまなプリミティブタイプとオブジェクトタイプにとって何を意味するかを見ていきます。

3.1. プリミティブタイプ

プリミティブ型は単純なので、まず始めましょう。 プリミティブ型の場合、getName()、getTypeName()、およびgetCanonicalName()の3つのメソッドはすべて、getSimpleName()と同じ結果を返します。

assertEquals("int", int.class.getName());
assertEquals("int", int.class.getTypeName());
assertEquals("int", int.class.getCanonicalName());

3.2. オブジェクトタイプ

これらのメソッドがオブジェクトタイプでどのように機能するかを見ていきます。 それらの動作は一般的に同じです:それらはすべてクラスの正規名を返します。

ほとんどの場合、これは、クラスの単純な名前だけでなく、すべてのクラスパッケージの単純な名前を含む修飾名です。

assertEquals("com.baeldung.className.RetrieveClassName", RetrieveClassName.class.getName());
assertEquals("com.baeldung.className.RetrieveClassName", RetrieveClassName.class.getTypeName());
assertEquals("com.baeldung.className.RetrieveClassName", RetrieveClassName.class.getCanonicalName());

3.3. インナークラス

前のセクションで見たのは、これらのメソッド呼び出しの一般的な動作ですが、いくつかの例外があります。

内部クラスはその1つです。 getName()および getTypeName()メソッドは、内部クラスの getCanonicalName()メソッドとは異なる動作をします。

getCanonicalName()は、クラスの正規名を返します。これは、囲んでいるクラスの正規名と、ドットで区切られた内部クラスの単純な名前です。

一方、 getName()メソッドと getTypeName()メソッドはほとんど同じを返しますが、は、囲んでいるクラスの正規名と内部の区切り文字としてドルを使用しますクラスの単純な名前

RetrieveClassNameの内部クラスInnerClassを想像してみましょう。

public class RetrieveClassName {
    public class InnerClass {}
}

次に、各呼び出しは、わずかに異なる方法で内部クラスを示します。

assertEquals("com.baeldung.RetrieveClassName.InnerClass", 
  RetrieveClassName.InnerClass.class.getCanonicalName());
assertEquals("com.baeldung.RetrieveClassName$InnerClass", 
  RetrieveClassName.InnerClass.class.getName());
assertEquals("com.baeldung.RetrieveClassName$InnerClass", 
  RetrieveClassName.InnerClass.class.getTypeName());

3.4. 匿名クラス

匿名クラスは別の例外です。

すでに見てきたように、それらには単純な名前はありませんが、それらには正規名もありません。 したがって、 getCanonicalName()は何も返しません。 getSimpleName()とは反対に、getCanonicalName()は、匿名クラスで呼び出されたときに空の文字列ではなくnullを返します。

getName() getTypeName()については、呼び出しクラスの正規名に続いて、すべての匿名クラスの中での匿名クラスの位置を表すドルと数字が返されます。呼び出し元のクラスで作成されます。

これを例で説明しましょう。 ここで2つの匿名クラスを作成し、最初に getName()を呼び出し、2番目に getTypeName()を呼び出し、com.baeldung.Mainで宣言します。 :

assertEquals("com.baeldung.Main$1", new RetrieveClassName() {}.getClass().getName());
assertEquals("com.baeldung.Main$2", new RetrieveClassName() {}.getClass().getTypeName());

2番目の呼び出しは、2番目の匿名クラスに適用されるため、最後に番号が増加した名前を返すことに注意してください。

3.5. 配列

最後に、上記の3つの方法で配列がどのように処理されるかを見てみましょう。

配列を処理していることを示すために、各メソッドは標準の結果を更新します。 getTypeName()メソッドとgetCanonicalName()メソッドは、結果に角かっこを追加します。

2次元InnerClass配列でgetTypeName()および getCanonicalName()を呼び出す次の例を見てみましょう。

assertEquals("com.baeldung.RetrieveClassName$InnerClass[][]", 
  RetrieveClassName.InnerClass[][].class.getTypeName());
assertEquals("com.baeldung.RetrieveClassName.InnerClass[][]", 
  RetrieveClassName.InnerClass[][].class.getCanonicalName());

最初の呼び出しで、ドットの代わりにドルを使用して、名前の残りの部分から内部クラスの部分を分離していることに注意してください。

getName()メソッドがどのように機能するかを見てみましょう。 プリミティブ型の配列で呼び出されると、開き角かっこと、プリミティブ型を表す文字が返されます。 次の例で、2次元のプリミティブ整数でそのメソッドを呼び出すことを確認しましょう。配列:

assertEquals("[[I", int[][].class.getName());

一方、オブジェクト配列で呼び出されると、標準の結果に開き角かっことL文字が追加され、セミコロンで終了します。 RetrieveClassNameの配列で試してみましょう。

assertEquals("[Lcom.baeldung.className.RetrieveClassName;", RetrieveClassName[].class.getName());

4. 結論

この記事では、Javaでクラス名にアクセスするための4つのメソッドについて説明しました。 これらのメソッドは、 getSimpleName()、getName()、getTypeName()、および getCanonicalName()です。

最初のものはクラスのソースコード名を返すだけで、他のものはパッケージ名やクラスが内部クラスか匿名クラスかなどの詳細情報を提供することを学びました。

この記事のコードは、GitHubにあります。