Java的getCanonicalName和getName

Posted 惟是致良知

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java的getCanonicalName和getName相关的知识,希望对你有一定的参考价值。

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

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

package my;

public class ExternalClassConfig 

	private String desc;

	//    ...
    
    public static class InternalConfig 
    	//      ...
    

    
类里面含有个内部类。

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

	@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来说这两个方法没有什么不同的。但是对于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[]
不习惯这种表示可能觉得有点怪。首先 ‘[’ 表示数组,一个代表一维数组,比如 '[[' 代表二维数组。之后 'L' 代表类描述符,最后分号表示结束。

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


以上是关于Java的getCanonicalName和getName的主要内容,如果未能解决你的问题,请参考以下文章

关于JAVA泛型数组类型擦除引发的问题及解决方案

android 判断sd的状态,所有文件,剩余空间的大小

java的get和set方法

java的get和set方法

java中get和set方法为啥get在前

关于java中get方法的问题..