V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kings0527
V2EX  ›  Java

来几个真* Java 大神指点一下一个重写方法的非正常操作

  •  
  •   kings0527 · 2020-07-23 11:32:35 +08:00 · 2398 次点击
    这是一个创建于 805 天前的主题,其中的信息可能已经有所发展或是发生改变。

    其实本身环境是反编译注入代码 当前的上下文环境中 有一个 innerclass 可以 find 然后 new 出来 innerclass 本身扩展重写了 baseclass 里面的某个回调函数 onrespones innerclass 生成的对象可以通过 invoke 的方式去执行 execute 函数触发 onrespones

    问题:如何 1)正向的方式去 new 出一个对象 2 )重写这个对象的 onrespones 方法 3)执行 execute 函数 4)触发自己重写的 onrespones 函数

    问题扩展 1:当前环境下只有一个 object 如何通过反射或者代理或者其他方式 来重写这个 object 的某个方法

    问题扩展 2:使用动态代理 new 出一个新的 object 在动态代理类中过滤 invoke 方法进行处理可以实现当前问题 但是仅限于源码级别编译环境 (innerclass)Proxy.newProxyInstance(classloader, Class, new InvocationHandler() {.....}); 上句代码中使用类型强转应该是在编译期间就固定了返回对象的类,从而使返回的对象可以执行 innerclass 中 exexcute 函数 而在注入环境中,无法使用强制转换,使用 cast 函数也一样无效 应该怎么去使用动态代理 new 出 innerclass 的对象进行调用?

    问题补充:只是修改当前自己 new 出的 object 的方法 所以动态代理本身就是做这个事情的但是当前环境已经问题 2 讲出来了 并不需要也不想直接修改 innerclass 的方法 不然可以直接使用 hook 框架替换掉 这样子的话就影响到了原程序中所有使用这个 innerclass 的对象

    16 条回复    2020-08-19 18:06:17 +08:00
    kings0527
        1
    kings0527  
    OP
       2020-07-23 11:33:24 +08:00
    打的回车全部没了 难受了 。。。
    kings0527
        2
    kings0527  
    OP
       2020-07-23 11:36:57 +08:00
    再加一下问题总结 抱歉上面的格式 需要各位耐心读懂一下

    不是只执行这个对象的 execute 方法 还要重写这个对象的 onrespones 方法

    1 通过反射并且仅能 new 一个 imp 类的对象
    2 修改重写这个对象的 onrespones 方法 执行自己的逻辑(目前的方法是动态代理)
    3 通过动态代理 new 出来的对象去执行原对象的 execute 方法(没有类型转换 运行时 invoke 会 no method )

    一句话概括就是当前的 context 下 只有一个 innerobj 如何执行这个 innerobj 的 execute 方法 并且 劫持 onrespones 方法
    kings0527
        3
    kings0527  
    OP
       2020-07-23 11:42:24 +08:00
    感觉来几个做 Java 架构师的大佬应该可以几句话就点明解决方法
    感觉自己的思路被动态代理捆绑了
    或许还有其他思路达到这个目的 我绕了两天实在想不到了

    最差最差的办法就是 先 hook 修改这个类的 onrespones 方法
    然后添加标志位属性
    然后自己 new 出来的时候去更新标志位
    hook 拦截到以后根据标志位来查看是否处理

    但是这样子的话逻辑就需要写在两坨甚至很多坨代码里面
    不利于扩展和回调
    代码丑陋 数据混乱 看着实在想吐
    最主要的是想把这个坑填上
    CoderGeek
        4
    CoderGeek  
       2020-07-23 11:43:53 +08:00
    你能做个接口 子类继承这个 innerobj 嘛 然后 onrespones 自己实现 都注入可以不? 也可以做个 map 管理一下呢? 基本上就是动态代理 重写 一般配合接口和继承子类之类的方式解决
    kings0527
        5
    kings0527  
    OP
       2020-07-23 12:12:15 +08:00
    @CoderGeek 只能通过 findclass 获取到类 所以不能使用 extends 关键字
    当前上下文 有且仅有一个 object 所有的操作 都是基于反射来查找和调用
    kings0527
        6
    kings0527  
    OP
       2020-07-23 13:21:46 +08:00
    红包答谢可以吗 或许能解决这个问题的大神根本不在乎小恩小惠 略表心意 仅想做个技术储备
    blindpirate
        7
    blindpirate  
       2020-07-23 13:54:32 +08:00
    Bytebuddy.subclass(X.class)

    https://zhuanlan.zhihu.com/p/84514959
    SakuraSa
        8
    SakuraSa  
       2020-07-23 15:14:17 +08:00
    感觉是想做 AOP ?
    Spring 中是用 Proxy 和 Cglib 实现的。
    kings0527
        9
    kings0527  
    OP
       2020-07-23 15:58:27 +08:00
    是的 中心思想其实是 aop
    我还在看楼上大佬介绍的 buddy 框架
    quericy
        10
    quericy  
       2020-07-23 16:23:03 +08:00
    试试 Instrument ?可以运行时做字节码增强

    https://tech.meituan.com/2019/09/05/java-bytecode-enhancement.html#3-2-instrument
    kings0527
        11
    kings0527  
    OP
       2020-07-23 17:27:46 +08:00
    @blindpirate
    byte duddy 失败告终 找不到类
    我不知道它的操作是怎么实现的
    但是我的操作环境其实类似于在一个已经多个 jar 包项目的进程中 注入我自己的 jar 包
    其实就是通过注入的方式 入侵到某个 Android app 的进程 然后执行我自己的 jar


    @quericy 基于字节码的方式估计有点行不通 类似的还有 dexmaker 还有很多

    暂时弃坑了 心塞的很 先写一个屎一样的代码凑合吧
    CoooooolFrog
        12
    CoooooolFrog  
       2020-07-27 10:25:59 +08:00
    你可以了解一下 Java Attach 机制,通过 Attach 的方式可以实现你上面说的需求。
    “在一个已经多个 jar 包项目的进程中 注入我自己的 jar 包”
    但是你的环境是 Android App,我不太了解 Android 的 JVM 是否支持 Attach 机制,具体你可以搜索一下。
    CoooooolFrog
        13
    CoooooolFrog  
       2020-07-27 10:28:47 +08:00
    另外给你推荐一个开源项目,https://github.com/alibaba/jvm-sandbox,和你的需求很像,但是都是 Java 服务端的东西,不知道能否直接用在客户端上
    ye4tar
        14
    ye4tar  
       2020-07-27 16:07:19 +08:00
    感觉你在研究别人的 android 项目,想要搞他的 okhttp3 中的网络请求返回,加点自己的"佐料"已满足自己的口味,那么问题来了,这种事情直接下 hook,可以做到的效果是,该方法执行前和执行后中添加佐料
    122006
        15
    122006  
       2020-07-31 19:58:57 +08:00
    啥,又要运行原来的代码又要运行你重写的方法?那就上 hook 。标志位判断一下
    可以看一下 weishu 大佬的 epic
    kings0527
        16
    kings0527  
    OP
       2020-08-19 18:06:17 +08:00
    @122006 其实就是写 xposed 插件

    最差最差的办法就是 先 hook 修改这个类的 onrespones 方法
    然后添加标志位属性
    然后自己 new 出来的时候去更新标志位
    hook 拦截到以后根据标志位来查看是否处理


    上面说过了 不想一坨坨的写
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1234 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 18:11 · PVG 02:11 · LAX 11:11 · JFK 14:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.