黑马程序员技术交流社区

标题: 基础加强中的反射的问题 [打印本页]

作者: 李宁    时间: 2013-1-20 22:01
标题: 基础加强中的反射的问题
本帖最后由 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));
复制代码

作者: 王少雷    时间: 2013-1-20 22:28
其实这种问题,完全是JVM在搞怪。
你就这么理解吧。
Constructor 你就认为这就是一个类型对象,作用就是获取构造方法的一个对象,而他必须通过反射去获取。因为 他就在java.lang.reflect包里面。。。它仅仅代表一个对象,不是说通过一个反射就能改变这个对象 类型。
所以,下面出现了  通过这个对象 去newInstance的时候,JVM不认为,你用了反射它就是什么类型。
还是保持JVM默认类型。因为它是规定的,所以要强转。
就像:
Class clazz = Person.class;
                Person p = (Person) clazz.newInstance();
你明明通过反射拿到类字节码,而下面JVM却不承认一样。

作者: 李敬卫    时间: 2013-1-20 22:38
王少雷 发表于 2013-1-20 22:28
其实这种问题,完全是JVM在搞怪。
你就这么理解吧。
Constructor 你就认为这就是一个类型对象,作用就是获 ...

因为在javac编译时期,是不进行运算的,编译器只检查语法有无错误,你知道了他返回的是String类型,可是编译器不知道,所以会出错。
作者: 王少雷    时间: 2013-1-20 22:41
李敬卫 发表于 2013-1-20 22:38
因为在javac编译时期,是不进行运算的,编译器只检查语法有无错误,你知道了他返回的是String类型,可是 ...

是啊。
这就是应了张孝祥视频那句话,反射就是把各种元素类转换成对应JAVA类。。。
如果JVM自动就识别类型,还需要反射吗?{:2_30:}
作者: 李宁    时间: 2013-1-20 23:09
解释得很到位,谢谢




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