黑马程序员技术交流社区

标题: 关于反射的一点问题 [打印本页]

作者: 王桂丽    时间: 2012-8-26 12:47
标题: 关于反射的一点问题
new String(new StringBuffer("abc"));

需求:用字节码写上面的方法

Constructor constructor1=String.class.getConstructor(StringBuffer.class);
String str2=(String)constructor1.newInstance(new StringBuffer("abc"));

1、String.class:返回String类的字节码
2、String.class.getConstructor:获取String类里面的构造方法
3、String.class.getConstructor(StringBuffer.class):获取参数为StringBuffer的构造方法
4、constructor1.newInstance:通过构造方法建造实例对象
5、constructor1.newInstance(new StringBuffer("abc")):对象所传的参数是new StringBuffer("abc")
6、(String)constructor1.newInstance(new StringBuffer("abc")):因为编译时期不知道是String类型,所以强转String

疑问:
1、String.class.getConstructor(StringBuffer.class):获取的构造方法是否是存入内存中的字节码?还是得到的是“new String()”?
2、String.class.getConstructor(StringBuffer.class):编译时只是没有价值参数StringBuffer.class,String.class是不是说明是String类呢?为什么(String)constructor1.newInstance(new StringBuffer("abc"))因此句说编译时期不知道是String类型,所以强转加"(String)"。








作者: 杨震    时间: 2012-8-26 13:07
第一个问题,获取的是内存中的字节码,new String()也是指的那段字节码啊
第二个问题,因为newInstance方法返回的是objec,所以必须强制转换为String.
编译器只检查类型是相符合,检查某类型的方法是否存在,检查表面语法,不会检查逻辑

以上是我个人猜想
作者: 黄敏    时间: 2012-8-26 13:17
请看下面红色标示部分,希望对你有帮助

疑问:
1、String.class.getConstructor(StringBuffer.class):获取的构造方法是否是存入内存中的字节码?还是得到的是“new String()”?
回答:字节码中肯定是有有的,没有你怎么获取的构造函数。其实也就是new String()的字节码实力String对象,这时的对象是Class对象,也就是字节码对
2、String.class.getConstructor(StringBuffer.class):编译时只是没有价值参数StringBuffer.class(要说的是,这是有价值的参数),String.class是不是说明是String类呢?(是String的字节码文件)为什么(String)
constructor1.newInstance(new StringBuffer("abc"))因此句说编译时期不知道是String类型,所以强转加"(String)"。因为你没编译,.class字节码文件是还没有生成的,所以无法确认你的参数类型了(就是object),所以就要加强转了

作者: 谭立文    时间: 2012-8-26 14:04
看了楼上的,我补充一点:
源文件(.java)经编译后生成的class文件并不是字节码,而是当程序运行时将.class文件加载到内存之后,经处理过后的才叫字节码。
作者: 王桂丽    时间: 2012-8-28 21:08
此问题已解决




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