JavaのgetCanonicalNameとgetName
2482 ワード
Javaでクラス名を取得するには、主にgetName()という3つの方法があります. getCanonicalName()とgetSimpleName()
例を挙げてそれらの違いを見てみましょう.たとえば、次のようなものです.
次に、クラスの上の3つのメソッドを呼び出して結果を見ます.
出力結果は次のとおりです.
ここでgetName()は仮想マシン内のclassの表示を返し、getCanonicalName()はより分かりやすい表示を返します.実はほとんどのclassにとってこの2つの方法は何の違いもありません.しかしarrayや内部クラスには違いがあります.
また、クラスローディング(仮想マシンローディング)に必要なクラスの名前はgetNameです.
配列を見てみましょう.
このコードはJNIフィールド記述子(JavaNative Interface FieldDescriptors)と呼ばれています.興味があれば自分で勉強してもいいです.
例を挙げてそれらの違いを見てみましょう.たとえば、次のようなものです.
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)と呼ばれています.興味があれば自分で勉強してもいいです.