获取方法*3
1. 类名.class
2. 类对象.getClass()
3. Class.forName("类名")
实例:
System.out.println(TestClass.class);
System.out.println(Class.forName("TestClass"));
TestClass t = new TestClass();
System.out.println(t.getClass());
区别
总结:
第一步:TestClass类仅被 类加载器 载入内存,未进行任何初始化
TestClass.class 方法可在 “混沌” 时代获取 类模板对象
第二步:TestClass类及其父类 进行了静态初始化
Class.forName(“TestClass”) 方法会对 目标类 进行静态初始化,并获取 类模板对象
第三步:TestClass类及其父类 进行了实例化
new TestClass().getClass() 方法可在 对象实例化后,获取 对象的运行时类模板对象
亦可称为,object.getClass()获取 真实类型
实证
Test.java
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
System.out.println("--- Test.class ---");
System.out.println(TestClass.class);
System.out.println("--- Class.forName ---");
System.out.println(Class.forName("TestClass"));
System.out.println("--- t.getClass ---");
SuperTestClass t = new TestClass();
System.out.println(t.getClass());
/*Result:
--- Test.class ---
class TestClass
--- Class.forName ---
S静态初始化
静态初始化
class TestClass
--- t.getClass ---
S非静态初始化
S构造函数初始化
非静态初始化
构造函数初始化
class TestClass
*/
}
}
TestClass.java
public class TestClass extends SuperTestClass {
public TestClass() {
System.out.println("构造函数初始化");
}
static{
System.out.println("静态初始化");
}
{
System.out.println("非静态初始化");
}
}
class SuperTestClass{
public SuperTestClass() {
System.out.println("S构造函数初始化");
}
static{
System.out.println("S静态初始化");
}
{
System.out.println("S非静态初始化");
}
}