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