上代码!!!
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对象。为了使用类而做的准备工作实际包含三个步骤:
- 加载,这是由类加载器执行的。该步骤将查找字节码,并从这些字节码中创建一个Class对象。
- 链接,在链接阶段将验证类中的字节码,为静态域分配存储空间,并且如果必需的话,将解析这个类创建的对其他类的所有引用。
- 初始化,如果该类具有超类,则对其初始化,执行静态初始化器和静态初始化块。