获得Class引用的三种方式?Class.forName()、getClass以及.class的使用

上代码!!!

package com.spring.partise;

class A{
    static{
        System.out.println("I am A");
    }
}
public class helllo {
    public static void main(String[] args) throws Exception {
        System.out.println("------------得到Class对象的两种方式---------------");
        A a = new A();
        Object a1= a.getClass();
        System.out.println(a1.hashCode());
        System.out.println("---------------------------");
        Object name = Class.forName("com.spring.partise.A");
        System.out.println(name.hashCode());
        System.out.println(a1==name);
    }
}

输出:

------------得到Class对象的两种方式---------------
I am A
705927765
---------------------------
705927765
true

总结:

只要你想在运行时使用类型信息,就必须首先获得对恰当的Class对象的引用,Class.forName()就是实现此功能的便捷途径,因为你不需要为了获得Class引用而持有该类型的对象。但是,如果你已经拥有了该类型的对象(A a = new A() ),那就可以通过调用getClass()方法来获取Class引用,这个方法属于Object的一部分。

当然还有第三种得到类的类对象方式就是通过类名.class这里就不测试了,通过类字面常量生成Class对象的引用不仅更简单,而且更安全,因为它在编译时就会受到检查,并且根除了对forName方法的调用所以更高效,可以应用于接口、数组、基本数据类型等,通过该方式创建Class对象的引用时候不会自动地初始化该Class对象。为了使用类而做的准备工作实际包含三个步骤:

  1. 加载,这是由类加载器执行的。该步骤将查找字节码,并从这些字节码中创建一个Class对象。
  2. 链接,在链接阶段将验证类中的字节码,为静态域分配存储空间,并且如果必需的话,将解析这个类创建的对其他类的所有引用。
  3. 初始化,如果该类具有超类,则对其初始化,执行静态初始化器和静态初始化块。

猜你喜欢

转载自blog.csdn.net/dreamzuora/article/details/80185952
今日推荐