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)。有兴趣的话可以自己学习下。