关于类加载器的一个小问题 求助.

北北啊我是 2020-10-15 03:40:14
看周志明老师的Java虚拟机书里有这么一段------
"如果读者有兴趣的话,可以尝试去写一个与rt.jar类库中已有类重名的Java类,将会发现它可以正常编译,但永远无法被加载运行"
我试了下, 发现自定义的重名类(我这里是"LineTokenizer"这个类) ,可以被正常加载使用?
是我哪里理解错了吗?


...全文
6732 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰思雨 2020-10-23
  • 打赏
  • 举报
回复
希望楼主能够仔细看看我回复的内容(10楼和14楼),如果还是看不明白,我觉得,转行干点别的也是个不错的选择。
冰思雨 2020-10-23
  • 打赏
  • 举报
回复
冰思雨 2020-10-23
  • 打赏
  • 举报
回复
引用 16 楼 北北啊我是 的回复:
感谢回复 其实我昨天把包也写成重名的以后也报了这个找不到main函数的错 但我遇到了另一个问题 导致我没觉得这是加载类出的问题 1.把LineTokenizer类换成同包下(rt.jar/ com.sun.activation.registries)的MailcapFile这个类 自己写个同包同名的这个类 2.在其他类中new一个自己写的MailcapFile对象,打印,发现能够实例化这个对象。 这点我很奇怪啊。。 为啥能加载出来这个类呢。。 不应该直接报错么。。
你怎么确定new(实例化)的这个对象,就是你自己定义的类,而不是rt.jar包中的类呢? MailcapFile这个类在rt.jar包中,为啥不能加载? 问题的关键是,你怎么知道,你加载的不是rt.jar中的类?
北北啊我是 2020-10-23
  • 打赏
  • 举报
回复
引用 15 楼 冰思雨 的回复:
希望楼主能够仔细看看我回复的内容(10楼和14楼),如果还是看不明白,我觉得,转行干点别的也是个不错的选择。
感谢回复 其实我昨天把包也写成重名的以后也报了这个找不到main函数的错 但我遇到了另一个问题 导致我没觉得这是加载类出的问题 1.把LineTokenizer类换成同包下(rt.jar/ com.sun.activation.registries)的MailcapFile这个类 自己写个同包同名的这个类 2.在其他类中new一个自己写的MailcapFile对象,打印,发现能够实例化这个对象。 这点我很奇怪啊。。 为啥能加载出来这个类呢。。 不应该直接报错么。。
北北啊我是 2020-10-22
  • 打赏
  • 举报
回复
引用 4 楼 qq_39936465 的回复:
这种类编译工具自己的无法加载的类你重写了也没意义,你需要找一下编译器能加载的类
请问哪种算是编译器能加载的类啊
北北啊我是 2020-10-22
  • 打赏
  • 举报
回复
引用 8 楼 新手村0617 的回复:
包的路径类型一样
我写了一下包路径及类名都一样的 依然能运行不知道咋搞啊。。
北北啊我是 2020-10-22
  • 打赏
  • 举报
回复
引用 10 楼 冰思雨 的回复:
你编写的类没没有 package 吗?应该是 package 不一致,所以,识别为不同的class。 JVM识别一个类是通过(ClassLoader对象ID + package Name + class Simple Name),其实,className里面就包含package的。 同一个 ClassLoader对象 无法加载两个或两个以上相同的类,因为 ClassLoader对象 内部有缓存,只会加载第一次加载的那个类。
我自定义了一个包 包名跟 rt.jar下的一个包名一致,然后在我自定义包中写了一个重名类,发现还能正常运行啊。。。 没搞懂是要怎么操作了。。
冰思雨 2020-10-19
  • 打赏
  • 举报
回复
你编写的类没没有 package 吗?应该是 package 不一致,所以,识别为不同的class。 JVM识别一个类是通过(ClassLoader对象ID + package Name + class Simple Name),其实,className里面就包含package的。 同一个 ClassLoader对象 无法加载两个或两个以上相同的类,因为 ClassLoader对象 内部有缓存,只会加载第一次加载的那个类。
北北啊我是 2020-10-16
  • 打赏
  • 举报
回复
引用 2 楼 做一个海贼 的回复:
包名不一样吧,相当于两个类
哦 我秀逗了 我试试自己定义个一样的包
引用 5 楼 qq_39936465 的回复:
你重写的类非public类,本包外无法调用,你重写后变成public类,可以包外调用了。这样2个类权限不同,当包外调用时并不会造成冲突。
懂了一点 我找找别的类试一下
韩_师兄 2020-10-16
  • 打赏
  • 举报
回复
包的路径类型一样
北北啊我是 2020-10-16
  • 打赏
  • 举报
回复
引用 2 楼 做一个海贼 的回复:
包名不一样吧,相当于两个类
rt.jar包下的 类 我怎么能在同包下再写一个重名类呢???
北北啊我是 2020-10-16
  • 打赏
  • 举报
回复
引用 1 楼 qq_39936465 的回复:
[quote=引用 楼主 北北啊我是 的回复:]看周志明老师的Java虚拟机书里有这么一段------ "如果读者有兴趣的话,可以尝试去写一个与rt.jar类库中已有类重名的Java类,将会发现它可以正常编译,但永远无法被加载运行" 我试了下, 发现自定义的重名类(我这里是"LineTokenizer"这个类) ,可以被正常加载使用? 是我哪里理解错了吗?
你确定你这个类是rt.jar下面的么?[/quote] 您看第三张图 是rt.jar下的呀
qq_39936465 2020-10-15
  • 打赏
  • 举报
回复
你重写的类非public类,本包外无法调用,你重写后变成public类,可以包外调用了。这样2个类权限不同,当包外调用时并不会造成冲突。
qq_39936465 2020-10-15
  • 打赏
  • 举报
回复
这种类编译工具自己的无法加载的类你重写了也没意义,你需要找一下编译器能加载的类
qq_39936465 2020-10-15
  • 打赏
  • 举报
回复
我反正1.8下面没找到这个类
做一个海贼 2020-10-15
  • 打赏
  • 举报
回复
包名不一样吧,相当于两个类
qq_39936465 2020-10-15
  • 打赏
  • 举报
回复
引用 楼主 北北啊我是 的回复:
看周志明老师的Java虚拟机书里有这么一段------ "如果读者有兴趣的话,可以尝试去写一个与rt.jar类库中已有类重名的Java类,将会发现它可以正常编译,但永远无法被加载运行" 我试了下, 发现自定义的重名类(我这里是"LineTokenizer"这个类) ,可以被正常加载使用? 是我哪里理解错了吗?
你确定你这个类是rt.jar下面的么?

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧