类名.class Class.forName("类的全路径") 对象实例.getClass的区别

      首先,三种方式均为获取该类的一个类对象。那什么是类对象呢?实际上,在Java中每一个类在被编译成为.class文件的时候,JVM(Java虚拟机)都将会自动对每一个类创建一个类对象,这个类对象包含了这个类的所有的信息(包括成员变量、方法、构造器)。今后我们在创建这个类的实例或者这个类的对象时都是以这个类的类对象为蓝图(或模板)来构建的,如

Class c =Class.forName("com.ceb.User"); 其中的c 就为Uer类的类对象,而User u=new User();其中u为User的一个类,那么u就是以c为模板来构建的,也就是说c.newInstance()=u;

   而这三种在构建类的类对象时也存在着一些区别:

1.类名.class ,采用这种方式,JVM使用类加载器将该类加载到内存当中(前提是内存中还没有加载该类),但是不会做类的初始化工作,返回Class类的一个类对象;

2.Class.forName("类的全路径"),其中类的全路径名为:包+类名,此时JVM在将类加载到内存的同时还会做一些静态的初始化工作,比如使用static修饰的变量,或者static修饰的代码块,返回Class类的一个对象;

3.对象实例.getClass() ,这种方式除了会对类进行静态初始化外,还能够进行非静态初始化。它返回的是在引用运行时真正指向的对象(因为子类对象的引用可能给赋值给父类对象的引用变量,如在多态中)所属类的一个Class对象;

使用代码进行验证:

如验证第一种方式:

package com.nantian.util.test;
public class Test {
    public Test(){
    System.out.println("---构造函数--");
    }
    static{
    System.out.println("----静态参数的初始化---");
    }
    {
    System.out.println("----非静态参数的初始化----");
    }

}

package com.nantian.util.test;
public class Main {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
//测试类名.class
Class c=Test.class;
System.out.println("类名.class-----"+c);
//测试Class.forName("类的全路径");
Class c1=Class.forName("com.nantian.util.test.Test");
System.out.println("Class.forName('类的全路径')---"+c1);
//测试类实例.getClass()
Test t=new Test();
Class c2=t.getClass();
System.out.println("类实例.getClass()---"+c2);
}
}

打印的输出结果为:

类名.class-----class com.nantian.util.test.Test
----静态参数的初始化---
Class.forName('类的全路径')---class com.nantian.util.test.Test
----非静态参数的初始化----
---构造函数--
类实例.getClass()---class com.nantian.util.test.Test

 我们可以发现三者产生的Class对象是一样的,并且静态参数的初始化只显示了一次。

我们知道静态方法属性以及静态代码块的初始化是在类加载时候进行的,而非静态方法属性以及代码块初始化是在使用new创建类的实例时候进行的。

因此,我们可以将JVM加载类和创建类对象的过程如下:首先JVM会将字节码文件即.class文件加载到内存中,然后类加载器在内存中加载字节码文件,然后在方法区存放生成的class类的类对象。然后在创建对象之前会检测该类是否在类加载器中已经加载,如果未加载,执行加载过程,如果已经加载了,则直接创建类的实例;

具体的加载与创建的顺序可参考一篇博客:http://blog.csdn.net/glory1234work2115/article/details/50813396

  

本人也是初学,有问题的地方还望各位大神指正

参考:http://www.cnblogs.com/xuan52rock/p/6443271.html


猜你喜欢

转载自blog.csdn.net/xiongmaodeguju/article/details/70854645
今日推荐