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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王桂丽 中级黑马   /  2012-8-26 12:47  /  1447 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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)"。







4 个回复

倒序浏览
第一个问题,获取的是内存中的字节码,new String()也是指的那段字节码啊
第二个问题,因为newInstance方法返回的是objec,所以必须强制转换为String.
编译器只检查类型是相符合,检查某类型的方法是否存在,检查表面语法,不会检查逻辑

以上是我个人猜想
回复 使用道具 举报
请看下面红色标示部分,希望对你有帮助

疑问:
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),所以就要加强转了
回复 使用道具 举报
看了楼上的,我补充一点:
源文件(.java)经编译后生成的class文件并不是字节码,而是当程序运行时将.class文件加载到内存之后,经处理过后的才叫字节码。
回复 使用道具 举报
此问题已解决
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马