class对象

Class对象 (2007-03-16 22:50:23)转载▼
分类: Java编程
    要理解RTTI在Java中的工作原理,首先必须知道类型信息在运行时是如何表示的.这项工作是由称为"Class对象"的特殊对象完成的,它包含了与类有关的信息.事实上,Class对象就是用来创建类的所有的"普通"对象的.
    类是程序的一部分,每一个类都有一个Class对象,换言之,每当编写并且编译一个新类,就会产生一个Class对象(更恰当地说,是被保存在一个同名的.class文件中).在运行时,当我们想生成这个类的对象时,运行这个程序的JVM首先检查这个类的Class对象是否已经加载,如果尚未加载,JVM就会根据类名查找.class文件,并将其载入,所以Java程序并不是一开始执行就被完全加载的,这一点与许多传统语言都不同的.
    一旦某个类的Class对象被载入内存,它就被用来创建这个类的所有对象.如果这么解释仍然不清楚,请看下面的一个程序:
class Candy{
    static{
        System.out.println("Loading Candy");
    }
}
class Gum{
    static{
        System.out.println("Loading Gum");
    }
}
class Cookie{
    static{
        System.out.println("Loading Cookie");
    }
}
public class SweetShop{
    public static void main(String[] args){
       System.out.println("inside main");
       new Candy();
       System.out.println("After creating Candy");
       try{
           Class.forName("Gum");
       }catch(ClassNotFoundException e){
           System.out.println("Couldn't find Gum");
       }
       System.out.println("After Class.forName(\"Gum\")");
       new Cookie();
       System.out.println("After creating Cookie");
    }
}
输出结果为:
inside main
Loading Candy
After creating candy
After Class.forName("Gum")
Loaing Cookie
After creating Cookie
这里的每个类Candy,Gum和Cookie,都有一个static子句,这个子句在类第一次被加载时执行.这时会有相应的信息打印出来,告诉我们这个类什么时候被加载了.在main()中,创建对象的代码被置于打印语句之间,以帮助我们判断加载的时间点.从输出中可以看出,Class对象仅在需要的时候才被加载,static初始化是在类加载时进行的,特别有兴的一行是Class.forName("Gum");这个方法是Class类(所有Class对象都属于这个类)的一个static成员.Class对象就和其他对象一样,我们可以获取并操作它的引用.
    forName()是取得Class对象引用的一种方法,它是用一个包含目标类的文本名的String作输入参数,返回的是一个Class对象的引用,上面的代码忽略了返回值,对forName()的调用是为了它产生的"副作用":如果类Gum还没有加载就加载它,在加载的过程中,Gum的static子句被执行.
    在这个例子中,如果Class.forName()找不到要加载的类,它会抛出一个异常ClassNotFoundException.

猜你喜欢

转载自2249665877.iteye.com/blog/2243370