Java的getCanonicalName和getName

时间:2024-10-18 07:32:58

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

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

package my;

public class ExternalClassConfig {

	private String desc;

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

    
}
类里面含有个内部类。

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

	@Test
	public void testclassName() {
		();
		("方法                                值");
		("getName            " + ());
		("getCanonicalName   " + ());
		("getSimpleName      " + ());
		
		("getName            " + ());
		("getCanonicalName   " +());
		("getSimpleName      " +  ());
		
		();
	}

输出结果如下:

方法               值
getName            
getCanonicalName   
getSimpleName      ExternalClassConfig
getName            $InternalConfig
getCanonicalName   
getSimpleName      InternalConfig

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

再看数组:

	@Test
	public void testclassName4Array() {
		String [] ss = new String[]{
			"zw", "zz"
		};
		();
		("方法                                值");
		("getName            " + ().getName());
		("getCanonicalName   " + ().getCanonicalName());
		("getSimpleName      " + ().getSimpleName());
		
		();
	}
输出结果:

方法                 值
getName            [;
getCanonicalName   []
getSimpleName      String[]
不习惯这种表示可能觉得有点怪。首先 ‘[’ 表示数组,一个代表一维数组,比如 '[[' 代表二维数组。之后 'L' 代表类描述符,最后分号表示结束。

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