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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李宁 中级黑马   /  2013-1-20 22:01  /  1393 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 shaohuashang 于 2013-1-20 23:09 编辑
  1. Constructor constructor1 = String.class.getConstructor(StringBuffer.class);
  2. String str2 = (String)constructor1.newInstance(/*"abc"*/new StringBuffer("abc"));字符串的构造方法调用newInstance()方法创建的对象类型难道会不是string类型吗?为什还要再转换成string?
  3. System.out.println(str2.charAt(2));
复制代码

点评

这个是在设计反射时考虑的问题,因为在设计时,不确定用户newInstance出来的对象是什么类型的,就把返回类型设置为Object了  发表于 2013-1-20 23:57

评分

参与人数 1技术分 +1 收起 理由
黄锦成 + 1

查看全部评分

4 个回复

倒序浏览
其实这种问题,完全是JVM在搞怪。
你就这么理解吧。
Constructor 你就认为这就是一个类型对象,作用就是获取构造方法的一个对象,而他必须通过反射去获取。因为 他就在java.lang.reflect包里面。。。它仅仅代表一个对象,不是说通过一个反射就能改变这个对象 类型。
所以,下面出现了  通过这个对象 去newInstance的时候,JVM不认为,你用了反射它就是什么类型。
还是保持JVM默认类型。因为它是规定的,所以要强转。
就像:
Class clazz = Person.class;
                Person p = (Person) clazz.newInstance();
你明明通过反射拿到类字节码,而下面JVM却不承认一样。
回复 使用道具 举报
李敬卫 来自手机 中级黑马 2013-1-20 22:38:08
藤椅
王少雷 发表于 2013-1-20 22:28
其实这种问题,完全是JVM在搞怪。
你就这么理解吧。
Constructor 你就认为这就是一个类型对象,作用就是获 ...

因为在javac编译时期,是不进行运算的,编译器只检查语法有无错误,你知道了他返回的是String类型,可是编译器不知道,所以会出错。

评分

参与人数 1黑马币 +9 收起 理由
黄锦成 + 9 赞一个!

查看全部评分

回复 使用道具 举报
李敬卫 发表于 2013-1-20 22:38
因为在javac编译时期,是不进行运算的,编译器只检查语法有无错误,你知道了他返回的是String类型,可是 ...

是啊。
这就是应了张孝祥视频那句话,反射就是把各种元素类转换成对应JAVA类。。。
如果JVM自动就识别类型,还需要反射吗?{:2_30:}
回复 使用道具 举报
解释得很到位,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马