JavaのgetCanonicalNameとgetName

2482 ワード

Javaでクラス名を取得するには、主にgetName()という3つの方法があります. getCanonicalName()とgetSimpleName()
例を挙げてそれらの違いを見てみましょう.たとえば、次のようなものです.
package my;

public class ExternalClassConfig {

	private String desc;

	//    ...
    
    public static class InternalConfig {
    	//      ...
    }

    
}
クラスには内部クラスが含まれています.
次に、クラスの上の3つのメソッドを呼び出して結果を見ます.
	@Test
	public void testclassName() {
		System.out.println();
		System.out.println("                                   ");
		System.out.println("getName            " + ExternalClassConfig.class.getName());
		System.out.println("getCanonicalName   " + ExternalClassConfig.class.getCanonicalName());
		System.out.println("getSimpleName      " + ExternalClassConfig.class.getSimpleName());
		
		System.out.println("getName            " + InternalConfig.class.getName());
		System.out.println("getCanonicalName   " +InternalConfig.class.getCanonicalName());
		System.out.println("getSimpleName      " +  InternalConfig.class.getSimpleName());
		
		System.out.println();
	}

出力結果は次のとおりです.
                  
getName            my.ExternalClassConfig
getCanonicalName   my.ExternalClassConfig
getSimpleName      ExternalClassConfig
getName            my.ExternalClassConfig$InternalConfig
getCanonicalName   my.ExternalClassConfig.InternalConfig
getSimpleName      InternalConfig

ここでgetName()は仮想マシン内のclassの表示を返し、getCanonicalName()はより分かりやすい表示を返します.実はほとんどのclassにとってこの2つの方法は何の違いもありません.しかしarrayや内部クラスには違いがあります.
また、クラスローディング(仮想マシンローディング)に必要なクラスの名前はgetNameです.
配列を見てみましょう.
	@Test
	public void testclassName4Array() {
		String [] ss = new String[]{
			"zw", "zz"
		};
		System.out.println();
		System.out.println("                                   ");
		System.out.println("getName            " + ss.getClass().getName());
		System.out.println("getCanonicalName   " + ss.getClass().getCanonicalName());
		System.out.println("getSimpleName      " + ss.getClass().getSimpleName());
		
		System.out.println();
	}
出力結果:
                    
getName            [Ljava.lang.String;
getCanonicalName   java.lang.String[]
getSimpleName      String[]
この表現に慣れていないのはちょっと変かもしれません.まず「[」は配列を表し、1次元配列を表し、例えば「[」は2次元配列を表す.その後、「L」はクラス記述子を表し、最後のセミコロンは終了を表す.
このコードはJNIフィールド記述子(JavaNative Interface FieldDescriptors)と呼ばれています.興味があれば自分で勉強してもいいです.