1
iseki 2021-10-07 10:46:22 +08:00
你在代码中写出的那个类,实际上就已经对应一个 ClassLoader 了
|
2
yidinghe 2021-10-07 11:15:57 +08:00 via Android
|
3
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 类加载器加载 这样类型转换时就不会报错了 |
4
SoloCompany 2021-10-07 22:45:20 +08:00
这是一个伪命题 /伪需求
强制类型转换对应的是编译时上下文而不是运行时上下文 强制类型转换的目的是通过编译的类型检查 而运行时并不存在类型检查, 也不需要强制类型转换 两个类型之间能够转换的前提是它们赋值相容 而 classLoaderA.load('a') 和 classLoaderB.load('a') 是两个完全不同的类, 赋值也不相容, 自然也不存在转换, 如果强行通过反射传参只会得到 argument type mismatch exception 如果只是希望测试两个类型是否相等或赋值相容, 可以直接用 == / equals / isAssignableFrom |