A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

任何合理存在的事物都有它存在的道理,"类名.class","对象名.getClass()","Class.forName("...")"是获取文件字节码的形式有三种,他们各有什么样特点,适用于哪些情况呢?那一种更好呢?

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

3 个回复

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



评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
类名.class,扩展性不是很强,做反射用的话就没法用了,因为字节码对象没办法用一个变量得到,只能直接写出来,如String.class    Integer.class等。

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


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

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
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();

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马