Java 请问不同类加载器加载的同名类仍然是不同类 那在类型强制转换的时候该如何申明转换的类是另一个类加载器的呢?

2021-10-07 09:38:30 +08:00
 Newyorkcity
谢谢
1140 次点击
所在节点    问与答
4 条回复
iseki
2021-10-07 10:46:22 +08:00
你在代码中写出的那个类,实际上就已经对应一个 ClassLoader 了
yidinghe
2021-10-07 11:15:57 +08:00
cs419
2021-10-07 12:12:09 +08:00
举例
```
class A{
public void test() {
// 普通的类
Person p = (Person) Myutil.obj01();
// 接口与实现类
CacheService cacheService = (CacheService) Myutil.obj02();
}
}
```

如果 A.class 由 c01 类加载器加载
obj01 的返回值的 class 由 c02 类加载器加载
那么这里类型转换会失败报错

因为 p 与 A 是同一个类加载器
即 p 也是由 c01 类加载器加载
CacheService 也是同样的道理

不过可以通过定义接口与实现类 敲定调用的方法名
调用时通过反射来调用
或者让 A.class 也是由 c02 类加载器加载
这样类型转换时就不会报错了
SoloCompany
2021-10-07 22:45:20 +08:00
这是一个伪命题 /伪需求

强制类型转换对应的是编译时上下文而不是运行时上下文
强制类型转换的目的是通过编译的类型检查

而运行时并不存在类型检查, 也不需要强制类型转换

两个类型之间能够转换的前提是它们赋值相容
而 classLoaderA.load('a') 和 classLoaderB.load('a') 是两个完全不同的类, 赋值也不相容, 自然也不存在转换, 如果强行通过反射传参只会得到 argument type mismatch exception

如果只是希望测试两个类型是否相等或赋值相容, 可以直接用 == / equals / isAssignableFrom

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/806175

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX