V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Newyorkcity
V2EX  ›  问与答

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

  •  
  •   Newyorkcity · 2021-10-07 09:38:30 +08:00 · 1131 次点击
    这是一个创建于 1163 天前的主题,其中的信息可能已经有所发展或是发生改变。
    谢谢
    4 条回复    2021-10-07 22:45:20 +08:00
    iseki
        1
    iseki  
       2021-10-07 10:46:22 +08:00
    你在代码中写出的那个类,实际上就已经对应一个 ClassLoader 了
    yidinghe
        2
    yidinghe  
       2021-10-07 11:15:57 +08:00 via Android
    cs419
        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 类加载器加载
    这样类型转换时就不会报错了
    SoloCompany
        4
    SoloCompany  
       2021-10-07 22:45:20 +08:00
    这是一个伪命题 /伪需求

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

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

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

    如果只是希望测试两个类型是否相等或赋值相容, 可以直接用 == / equals / isAssignableFrom
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5214 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 02:46 · PVG 10:46 · LAX 18:46 · JFK 21:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.