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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wnmmp 中级黑马   /  2014-8-4 18:52  /  1688 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 wnmmp 于 2014-8-4 18:57 编辑

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

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

0.png

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

4.png

5 个回复

倒序浏览
自己顶一下,是不是问得太简单了?
回复 使用道具 举报
编译器的工作原理短时间内是不可能明白的,这里也用不到。Date是JDK自带的类,字节码文件在%JAVA_HOME%\jre\lib\rt.jar中。视频的举例中,ClassLoaderAttachment类是Date的子类,强转当然是可以的
回复 使用道具 举报
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不是乱码
回复 使用道具 举报
wnmmp 发表于 2014-8-5 17:35
既然找到了%JAVA_HOME%\jre\lib\rt.jar,应该是通过委托机制找到BootStrap让它加载。那强转成ClassLoader ...

不是乱码怎么会加载不了?视频里为了让它乱码还特地介绍了.class文件存放的位置——bin目录,并把乱码文件copy到bin目录下替换正常文件
回复 使用道具 举报
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”不一样。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马