黑马程序员技术交流社区

标题: 关于字节码的问题 [打印本页]

作者: 水云间    时间: 2013-5-27 14:37
标题: 关于字节码的问题
前几天学习java反射,开始时就学习了反射的基石——Class类,一般来说,获得一个类的字节码有三种方式,下面用代码进行表示:
一.用一个实例对象获得
  1. List<String> list = new ArrayList<String>();
  2. Class cls1 = list.getClass();
复制代码
二.用一个类来获得
  1. Class cls2 = ArrayList.class;
复制代码
三.调用Class类的静态方法(forName(String str))
  1. Class cls3 = Class.forName("java.util.ArrayList");
复制代码
我想问的是这三种获得字节码的方式有什么区别,各用在哪些方面?
作者: 石贤芝    时间: 2013-5-27 15:28
本帖最后由 石贤芝 于 2013-5-27 15:29 编辑


首先说明,不是获取字节码,而是获取字节码文件的对象,即获取表示这个class文件的Class对象。

第一种方法的缺点是先要明确具体的类,并创建其对象。在反射中不建议使用,如果不知道具体类,在反射中也没法使用。

第二种方法利用任何数据类型都有一个静态的属性:.class属性;利用此静态属性来获取对应的Class对象。此方法相对简单,但仍需要明确类中的静态成员,不够扩展,不建议使用。

第三种方法利用Class类的方法Class.forName(className)来获取,这个只需要知道对应类的字符串名即可,扩展性好,操作方便,建议在反射中使用。

{:soso_e113:}


作者: 无妄无涯    时间: 2013-5-27 17:02
不是获取字节码啦,其实是从由JVM产生的字节码文件中获取要反射的类对象。
区别还是很明显的。第一种方法,先要明确具体的类并且要创建该类的对象,但先要用到反射的地方很多情况下是不知道用到的类的更别说其对象了。第二种方法,相比第一种方法是不用创建对象了,毕竟“.class”是静态属性,但是这种方法仍然要明确类中的静态成员,所以还是不够扩展。第三种方法则只需要知道类名就可以了,方便,扩展性最好,也是真正要用到反射时推荐用的。




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