java 类同名_java web为什么允许 包名和类名相同的情况?

这跟web没关系,是java的类加载机制。这个问题是jvm固有的。

有这么几种情况:

第一种,A和B两个jar都有同一个来自于C的类。但是他们没有用C.jar,而直接把C.jar里的那个类打到A和B里了。根据加载机制,JVM只会加载classpath中先找到的那个类。但因为A和B里的类是一样的,所以实际上加载了哪个是没所谓的事情。

第二种,还是上面的场景。A和B都用了C,但是A用的C是一个版本v1;B用的C是第二个版本v2。而这俩完全不兼容。这时,无论如何都解决了不了,除非B和C各自实现了自己加载A时的classloader。一般来讲,库的开发者在使用同一个full qualified class name时,必须保证向前兼容,这样至少可以想办法让jvm加载那个高版本的C;如果不能兼容,就必须改一个不同的名字。如果库的开发者坚持用同样的名字,却总是搞不兼容,就会被骂死。他写的代码会被唾弃。

第三种,比如一段代码X使用了类A,X上有你写的代码,但是你想故意破坏,搞一个完全同名,但是功能不一样的(比如把密码泄漏出来)的类A',并且启动时,把A'排到classpath靠前的地方。为了解决这种问题,代码X在加载A时,可以自定义classloader去要求一定要加载真正的A(一般是强制某个目录,再加上某种签名认证的机制)。

最后一种就属于你这样玩耍的:)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值