反射-三种获取类对象途径初始化过程的对比

173 阅读1分钟

实验代码

public class TestReflection {
    public static void main(String[] args){
        String className = "com.how2java.test.Hero";
        try{

            Class test1 = Class.forName(className);
            Class test2 = Hero.class;
            Class test3 = new Hero().getClass();
            System.out.println(test1 == test2);
            System.out.println(test2 == test3);
            System.out.println(test1 == test3);
        }catch (Exception ex){ex.printStackTrace();}
    }
}
class Hero{
    String name;
    static int a = 1;
    static {
        System.out.println("静态初始化块");
    }
    {
        System.out.println("普通初始化块");
    }
    Hero(){
        System.out.println("构造器");
    }
    String getName(){
        return name;
    }
}

结果

true
true
true

1 单独测试Class.forName

结果

静态初始化块

2 单独测试 Hero.Class


3 单独测试 new Hero().getClass

静态初始化块
普通初始化块
构造器

4 先初始化一个Hero对象,再测试这3种途径

更改代码如下:

            Hero hero = new Hero();
            Class test1 = Class.forName(className);
            Class test2 = Hero.class;
            Class test3 = new Hero().getClass();

4.1 Class.forName

静态初始化块
普通初始化块
构造器

4.2 Hero.Class

静态初始化块
普通初始化块
构造器

4.3 new Hero().getClass

静态初始化块
普通初始化块
构造器
普通初始化块
构造器