日期:2014-05-20  浏览次数:20689 次

关于CLASS类的一个疑问
Class类得到class对象有3种方法:
1:用Class.forname();这个我能理解,因为这样就像是ClsssLoader的loadclass方法把Class文件放到jvm中然后返回一个class对象;
2:用类的对象的引用.getClass()l这个我也能理解,因为当用对象的引用来获取的时候,首先这个类肯定是已经load到内存中去了,所以可以直接拿到class对象
3:用类.Class,这个我不怎么理解,我是不是也可以这样理解当类调用.class方法的时候其实和Class.forname();是一样的就是把这个类load到jvm了吗?求大神看下我这3个理解多不对 ,特别是第三个,第三个别的情况我实在想不出了谢谢

------解决方案--------------------
建议lz参考下《Thinking In Java》的[类型信息]这一章,尤其是[类字面常量]这一节;

大概的意思是,Class对象可用前大约是3个阶段:加载-》链接-》初始化(比如执行静态初始化块);
Class.forName3个阶段都立即执行;而.class只执行前两个阶段,在适当的时候才执行初始化这个阶段;
这里面的加载阶段应该就是lz说的load到jvm的阶段;

另 .class这种方式是编译时检查,Class.forName参数是字符串,编译时检查不出错误来;

------解决方案--------------------
虚拟机在装载类的时候都会加载静态方法,三种都是Class的生成方式。
当我们编写一个新的java类时,JVM就会帮我们编译成class对象,存放在同名的.class文件中。在运行时,当需要生成这个类的对象,JVM就会检查此类是否已经装载内存中。若是没有装载,则把.class文件装入到内存中。若是装载,则根据class文件生成实例对象。
.class也是加载类的一种方式。
Test test = new Test();
test.getClass()==Test.class();
他们的区别就是一个通过实例返回类型,一个通过类返回类的类型
相同点就是都是加载类。

------解决方案--------------------
第三个其实你可以这样看 比如:String s = new String();
s.class;这个很明显其实是可以看出class其实是你new出的String里面的一个public的一个属性就像你创建一个对象
Class A{
public Class aClass = A.getClass();
}
A a = new A();
a.aClass;其实也就是A对应的class对象而已