账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    java Android 反射得到的变量为什么用两次强制类型转换(Object[]) ((Object[])的到原来的类型
    75
    0
    问题描述Android 热修复中替换DexPathList中的dexElements字段下面 代码中为什么用了两次数组类型的强制转换(Object[]) ((Object[]),而不是一次问题出现的环境背景及自己尝试过哪些方法相关代码jlrField 是反射得到的DexPathList中的dexElements字段,这个字段不是Element[]类型吗 Object[] original = (Object[]) ((Object[]) jlrField.get(instance)); System.out.println("-----------------"); System.out.println(original.getClass()); //class [Ldalvik.system.DexPathList$Element; System.out.println(original.getClass().getComponentType()); //class dalvik.system.DexPathList$Element Object[] combined = (Object[]) ((Object[]) Array.newInstance(original.getClass() .getComponentType(), original.length + extraElements.length)); System.arraycopy(original, 0, combined, 0, original.length); System.arraycopy(extraElements, 0, combined, original.length, extraElements.length); jlrField.set(instance, combined);你期待的结果是什么?实际看到的错误信息又是什么?
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 回憶盡是傷 普通会员 1楼

      在Java中,当你使用Object[]作为参数来调用反射方法时,这个Object[]会被强制转换为一个Object[]的引用。这个引用实际上就是一个Object[]的副本,而不是Object[]本身。

      如果你直接使用Object[],那么你的代码将会抛出ClassCastException,因为Object[]实际上不是Object[],而是一个Object[]的引用。

      但是,如果你使用Object[][],那么这个Object[]会被强制转换为一个Object[]的引用,这个引用就是一个Object[]的副本。这样,你的代码就可以正常运行,而不会抛出ClassCastException

      总的来说,你需要根据你的需求来选择是否使用Object[]或者Object[][]。如果一个Object[]的引用代表了你需要的Object[],那么使用这个引用就足够了。如果一个Object[]的引用代表了一个需要复制的Object[],那么使用这个引用就足够了。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部