黑马程序员技术交流社区

标题: 反射的小问题 [打印本页]

作者: 袁计艳    时间: 2012-3-31 13:36
标题: 反射的小问题
String obj=(String)classforName("java.lang.String").newInstance();
用缓存机制来保存默认机制的方法创建实例对象,这块比较晕?怎么理解才能更透彻呢?
作者: 何万县    时间: 2012-3-31 13:45
String obj=(String)class.forName("java.lang.String").newInstance();
class.forName("java.lang.String")得到String的字节码
调用newinstance方法创建一个字节码的对象然后强制转换为String赋给obj


这是我对这句话的理解,反射主要是为了当你传给一个对象,不知道它的类型,可以通过求当前对象的字节码,然后创建一个对象,不知道我理解的对不对,有错误的话,还希望高手纠正一下,谢谢!

作者: 翟友伟    时间: 2012-3-31 15:02
慢慢分开一步步看
String obj=(String)classforName("java.lang.String").newInstance();

classforName("java.lang.String")     寻找string 的字节码 (相当于string.class)
.newInstance();    用string.class(字节码)创建一个对象 。   把它看成new ();
返回的对象  强转string 类型  
并赋值给obj
作者: 薛波    时间: 2012-3-31 15:03
class.forName("java.lang.String")得到String类的字节码对象
这里不光是String 任何类在内存中只有同一份字节码
调用newinstance()方法是调用默认无参数的构造方法创建了一个具体的实体对象
但是编译器再编译的时候是不知道这个对象是String类型的所以要加上强转

如果想要构建带参数的对象就需要使用它的字节码来得到 你想要的构造方法的对象,然后调用此构造方法对象的 newInstance()即可。

作者: 李井山    时间: 2012-3-31 18:48
classforName("java.lang.String")是取得String的字节码。
在.newInstance()之前其实有个getConstructor方法,取得构造函数,这个构造函数是个不需要参数的,为了方便编程,又直接在Class类中增加了.newInstance()方法、
在未运行之前,编译器不知道构造函数new出来什么对象,所以要显式转换成(String)
作者: 抓哇    时间: 2012-3-31 19:15
对应JAVA内置类型而言都可以用这种特殊的反射方式即缓存机制 就因为他是内置的 也就是JVM已经准备了好的 (而String srr=new String();实际也是要通过它做的 这个是个人见解)
作者: 龚龙    时间: 2012-3-31 20:24
我把我学反射的经验分享给大家.....
开始学反射的时候,也是晕忽忽的,后来代码敲的多了,再结合了老师讲的一些理论,基本弄明白了反射到底是个啥!
我自己理解的很通俗的一句话--------------反射就是拿到类的字节码文件,通过这个类的字节码文件来做一些事情!
(Class也是一个类,这个类的实例对象就是二进制的字节码文件!)
什么是类的字节码文件? 就是通过Java源程序经过编译后,生成的那些.class结尾的文件.
有了这个字节码文件,还不可以为所欲为了,比如:
你写了一个类叫Person,我们通过反射拿这个Person类的字节码文件,这个字节码文件就是Person.class,这个Person.class是在硬盘上实际存在的...
怎么拿了,第一种方式就是通过文件名Class.forName("cn.itcast.Person");,就是这个Person类的文件名"Person" +这个Person类的包名"cn.itcast"(假如我放在这个包下,没有包可以不写.).
第二种方式就是类名.class了,就如Peron.class!
再怎么用,我就不多说了,大家看文档就都知道了.           




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