黑马程序员技术交流社区

标题: 类名.class,对象名.getClass(),Class.forName("...")区别问题 [打印本页]

作者: 黄成超    时间: 2013-2-7 11:15
标题: 类名.class,对象名.getClass(),Class.forName("...")区别问题
任何合理存在的事物都有它存在的道理,"类名.class","对象名.getClass()","Class.forName("...")"是获取文件字节码的形式有三种,他们各有什么样特点,适用于哪些情况呢?那一种更好呢?

作者: 王少雷    时间: 2013-2-7 13:32
Class cl=A.class; JVM将使用类A的类装载器,将类A装入内存(前提是:类A还没有装入内存),不对类A做类的初始化工作.返回类A的Class的对象
Class cl=对象引用o.getClass();返回引用o运行时真正所指的对象(因为:儿子对象的引用可能会赋给父对象的引用变量中)所属的类的Class的对象
Class.forName("类名"); JAVA人都知道.装入类A,并做类的初始化.
在编译时不知道类名的情况:Class c = Class.forName("类名");
在编译期知道类名的情况:Class c = 类名.class ;或者 class c= Integer.TYPE;
在类的实例已经的得到的情况:Class才= 对象名.getClass();
作者: 刘军亭    时间: 2013-2-8 09:03
类名.class,扩展性不是很强,做反射用的话就没法用了,因为字节码对象没办法用一个变量得到,只能直接写出来,如String.class    Integer.class等。

对象名.getClass() ,适合你有要获得(字节码对象)的类的实例对象的情况下使用,如果要获得一个类的字节码对象,而且你有这个类的实例对象就可以直接写了。
                             必须有那个实例对象才行。


Class.forName("...")",扩展性强,可以接受传进来的字符串类名直接得某类的字节码对象,一般反射时候用到此类。

作者: 念满    时间: 2013-2-8 11:05
1、类名.class ,例如:System.class
在源程序中直接写出来,编译器就知道是在获取类的字节码。
2、对象.getClass(),例如: new Date().getClass()
先创建一个类的对象,再通过这个对象,得到创建这个对象的类的字节码。
3、Class.forName("类名"),例如:Class.forName("java.util.Date");
通过类的名字的字符串获取类的字节码。好处是写程序时,可以将要获取字节码的类的名字用变量传进来,在反射中经常使用。
利用Class.forName得到一个类的字节码:(1).若该字节码还没有加载进内存,则利用类加载器加载指定的class文件,然后返回这个类的字节码文件对象
                                     (2).若该字节码已经加载进内存,则直接返回这个字节码文件对象








欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2