【问题标题】:is this possible with Java's ASM library? [closed]这对 Java 的 ASM 库有可能吗? [关闭]
【发布时间】:2013-11-05 23:15:00
【问题描述】:

我正在寻找使用 ASM 来修改正在运行的 jar 文件并想问一些问题。首先使用 ASM 我可以“实时”编辑吗?我的意思是,我可以编辑当前正在运行的 jar,例如一个游戏,然后将我的代码注入到 jars 类文件中并让它一直保持到 jar 关闭?所以它仍然会在游戏运行循环等中被调用?根据我的尝试,我只能让我的代码运行一次...... 谢谢

【问题讨论】:

    标签: java code-injection bytecode java-bytecode-asm


    【解决方案1】:

    看看java.lang.instrument 包。您可以编写一个注册ClassFileTransformer 的Java 代理。

    转换器可以使用 ASM 处理类文件中的字节码,将它们转换为您想要的,并从 ASM 返回新的字节码。 modifying class files after they have already been loaded 也有潜力,但这可能有点偶然,因为您必须确保不更改签名等。

    【讨论】:

      【解决方案2】:

      你也应该破解那个 jar 的 ClassLoader

      并在调用 findClass 时返回修改后的 Class

      【讨论】:

        【解决方案3】:

        您可以使用反射来更改运行时的代码行为。它不会留在“jar”中,至少在加载您需要的类时,一切都会好起来的。

        然后,您需要提供在程序中使用反射注入更改的机制。或者这就是我的方式,无论如何。

        此外:the answer to this question 具有更灵活的运行时修改选项。如果您使用它的第三个选项,您可以使用在JSR-223 中定义的工具以javascript(或其他语言)(related infoa blog dedicated to scripting in java)进行编码。

        【讨论】:

        • 谢谢,我看看这个
        • @iajrz 你是说你可以用反射API修改代码?请澄清,因为就目前而言,您的答案似乎是错误的。
        • 你可以在运行时修改行为,这是提问者需要的......他不需要存储它,所以他真的不需要修改字节码。如果放置了适当的钩子,则可以大幅修改代码的行为。例如:您有一个方法可以检查一些外部可修改的条件并根据它调用不同的方法;如果您以某些(尽管很微妙)的方式执行此操作,则可以让该方法在与环境交互的情况下完全改变其行为。
        • 几年前我不得不为 web 服务这样做,以避免每个月重新访问相同的代码:根据 SOAP 请求,可以实例化不同的类并调用方法。但是类、方法和参数发生了变化。因此,我们构建了一个代理,它的行为根据请求内容有很大不同。
        • @CharlesForsythe,感谢提问;我的措辞含糊不清。解决了这个问题并扩大了答案......我认为我们都从中获胜。
        猜你喜欢
        • 2022-06-17
        • 2013-03-23
        • 2010-12-08
        • 1970-01-01
        • 1970-01-01
        • 2015-03-02
        • 2013-02-23
        • 1970-01-01
        • 2013-06-08
        相关资源
        最近更新 更多