得到类的class对象我们可以通过三种方式获得:
1.Class c=类名.class;
使用这种方式获取Class对象,注意的是如果这个类没有被加载过,它将不会初始化这个类
2:Class c=对象.getClass();
返回对象真正所属的类的Class的对象(当上转型为父类时,如果使用这种方式,那么得到的会是这个对象真正所属类的class对象)例如:
A a=new B();//B是A的子类。那么调用a.getClass(),则是对应B类的class对象。
3:Class c=Class.forName("类名");
这种方式可以得到Class对象,并且如果这个类没有被加载过它将会初始化这个类。
查看.class与Class.forName()在初始化方面的区别。
class demo1{ final static String s="demo1"; static { System.out.println("demo1被初始化"); } demo1(){ System.out.println("newInstance调用默认无参数构造器"); } } class demo2{ static String s="demo2"; static { System.out.println("demo2被初始化"); } } class demo3{ static String s="demo3"; static { System.out.println("demo3被初始化"); } } public class ClassAndClassforNameTest { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException { System.out.println("------------Class.class方式--------------"); //System.out.println(demo1.s);//这句可以证明使用final static常量不需要初始化类 Class<demo1> c=demo1.class;//只加载了类,并没有初始化类。 //c.newInstance();//通过class对象创建实例也会初始化类,而且调用了无参构造器 System.out.println("------------new class方式--------------"); demo2 instance=new demo2();//这个肯定都知道,初始化了类 System.out.println("------------class.forName方式--------------"); Class<demo3> f=(Class<demo3>) Class.forName("demo3");//使用Class.forName()时也会初始化类 } }
输出结果:
------------Class.class方式-------------- ------------new class方式-------------- demo2被初始化 ------------class.forName方式-------------- demo3被初始化
版权声明:本文为博主原创文章,未经博主允许不得转载。
Class.forName()与类名.class以及getClass()的比较
原文地址:http://blog.csdn.net/woaishuoshihuo/article/details/47610359