Java的getCanonicalName和getName

来源:互联网 发布:武汉市广电网络分公司 编辑:程序博客网 时间:2024/05/17 09:06

Java中获取类名主要有三个方法供我们使用:getName(), getCanonicalName() 和getSimpleName().

举个例子看下它们的区别。比如如下类:

package my;public class ExternalClassConfig {private String desc;//    ...        public static class InternalConfig {    //      ...    }    }
类里面含有个内部类。

然后我们调用类的上面三个方法看下结果:

@Testpublic 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.ExternalClassConfiggetCanonicalName   my.ExternalClassConfiggetSimpleName      ExternalClassConfiggetName            my.ExternalClassConfig$InternalConfiggetCanonicalName   my.ExternalClassConfig.InternalConfiggetSimpleName      InternalConfig

这里,getName()返回的是虚拟机里面的class的表示,而getCanonicalName()返回的是更容易理解的表示。其实对于大部分class来说这两个方法没有什么不同的。但是对于array或内部类来说是有区别的。
另外,类加载(虚拟机加载)的时候需要类的名字是getName。

再看数组:

@Testpublic 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[]
不习惯这种表示可能觉得有点怪。首先 ‘[’ 表示数组,一个代表一维数组,比如 '[[' 代表二维数组。之后 'L' 代表类描述符,最后分号表示结束。

这种编码叫做JNI字段描述符(JavaNative Interface FieldDescriptors)。有兴趣的话可以自己学习下。


0 0
原创粉丝点击