直截了当地通过一段代码展示如何获取到类名:
package main;
public class Main {
public void test() {
System.out.println(this.getClass().getName());
}
public static void main(String[] args) {
new Main().test();
}
}
经过编译运行之后,程序的运行结果如下:
main.Main
// 运行的结果是类的全限定名
另外,之所以需要定义 test 方法,是因为在 main 方法中不能使用 this 关键字。这很好理解,main 属于静态方法,静态方法是属于类的,可以先于对象存在。但是 this 表示的是本类的对象,是依托对象存在的。
上面的程序通过this.getClass().getName()
获得了类的全限定名,那么,通过将 this 改换为 super, 即super.getClass().getName()
能够获取到父类的类名吗?下面的程序将给出验证。
package main;
public class SuperClass {
}
package main;
public class Test extends SuperClass {
public void test() {
System.out.println(super.getClass().getName());
}
public static void main(String[] args) {
new Test().test();
}
}
main.Test
很遗憾,通过super.getClass().getName()
得到的还是本类的完整类名,并没有像预想的那样拿到父类的全限定名。
解释:Java 语言中的任何类都继承自 Object 类,Object 中定义了 getClass() 方法:public final native Class<?> getClass();
,因为方法被声明为 final 与 native,所以不能覆盖该方法,通过 this.getClass()
与super.getClass()
最终调用的都是 Object 类中的 getClass() 方法,该方法的释义是Returns the runtime class of this {@code Object}. The returned {@code Class} object is the object that is locked by {@code static synchronized} methods of the represented class.
,也就是返回的是运行时类。
那么,如何才能得到父类的类名呢?
this.getClass().getSuperclass().getName()
将上面程序中 test 方法中用于获取类名的操作更换为上面的this.getClass().getSuperclass().getName()
,然后运行就可以得到 Test 的父类 SuperClass 的全限定名了。