黑马程序员技术交流社区
标题:
反射的小问题
[打印本页]
作者:
袁计艳
时间:
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