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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 袁计艳 中级黑马   /  2012-3-31 13:36  /  2279 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String obj=(String)classforName("java.lang.String").newInstance();
用缓存机制来保存默认机制的方法创建实例对象,这块比较晕?怎么理解才能更透彻呢?

6 个回复

倒序浏览
String obj=(String)class.forName("java.lang.String").newInstance();
class.forName("java.lang.String")得到String的字节码
调用newinstance方法创建一个字节码的对象然后强制转换为String赋给obj


这是我对这句话的理解,反射主要是为了当你传给一个对象,不知道它的类型,可以通过求当前对象的字节码,然后创建一个对象,不知道我理解的对不对,有错误的话,还希望高手纠正一下,谢谢!
回复 使用道具 举报
慢慢分开一步步看
String obj=(String)classforName("java.lang.String").newInstance();

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

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