黑马程序员技术交流社区

标题: 编译器如何实现类型强制转换? [打印本页]

作者: wnmmp    时间: 2014-8-4 18:52
标题: 编译器如何实现类型强制转换?
本帖最后由 wnmmp 于 2014-8-4 18:57 编辑

这是今天下午看《张孝祥Java高新技术》里关于类加载器方面遇到的一个问题,当把ClassLoaderTest代码中的clazz.newInstance()强制转成ClassLoaderAttachment类时,出现了错误,而强制转成Date就可以了,张老师说:“编译器去加载这个类名,编译器加载一个乱七八糟的,编译器就不干了”,据此推测他的意思是编译器用到了ClassLoaderAttachment.class(加密后的乱码),通过这个class进行强转,那为什么转成Date就可以了?Date的class从哪里来?这过程中编译器到底怎么实现强制转换的呢?由于不晓得编译器的工作原理,想了一个下午还没想通,求大神指点!

0.png (228.87 KB, 下载次数: 68)

0.png

4.png (127.35 KB, 下载次数: 73)

4.png

作者: wnmmp    时间: 2014-8-4 23:17
自己顶一下,是不是问得太简单了?
作者: fantacyleo    时间: 2014-8-5 01:15
编译器的工作原理短时间内是不可能明白的,这里也用不到。Date是JDK自带的类,字节码文件在%JAVA_HOME%\jre\lib\rt.jar中。视频的举例中,ClassLoaderAttachment类是Date的子类,强转当然是可以的
作者: wnmmp    时间: 2014-8-5 17:35
fantacyleo 发表于 2014-8-5 01:15
编译器的工作原理短时间内是不可能明白的,这里也用不到。Date是JDK自带的类,字节码文件在%JAVA_HOME%\jre ...

既然找到了%JAVA_HOME%\jre\lib\rt.jar,应该是通过委托机制找到BootStrap让它加载。那强转成ClassLoaderAttachment类时,为什么没有委托给AppClassLoader让它在classpath里面(即cn.itcast.day2)加载ClassLoaderAttachment.class呢?这里面的ClassLoaderAttachment.class不是乱码
作者: fantacyleo    时间: 2014-8-5 17:40
wnmmp 发表于 2014-8-5 17:35
既然找到了%JAVA_HOME%\jre\lib\rt.jar,应该是通过委托机制找到BootStrap让它加载。那强转成ClassLoader ...

不是乱码怎么会加载不了?视频里为了让它乱码还特地介绍了.class文件存放的位置——bin目录,并把乱码文件copy到bin目录下替换正常文件
作者: wnmmp    时间: 2014-8-5 18:34
fantacyleo 发表于 2014-8-5 17:40
不是乱码怎么会加载不了?视频里为了让它乱码还特地介绍了.class文件存放的位置——bin目录,并把乱码文 ...

谢谢你的解答,刚刚想通了很多!不过又有新问题,视频上确实把cn.itcast.day2里面的改成错误的。而且没有重新生成,我想起来我把ClassLoaderAttachment源文件里面的空行删了,然后保存,Eclipse自动生成了正确的ClassLoaderAttachment.class文件,刚打开是正确的,但是出现了“cn.itcast.day2.ClassLoaderAttachment cannot be cast to...”问题,难怪出现的问题跟张老师的乱码问题“Incompatible magic value 889275713”不一样。




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