【问题标题】:Bytecode manipulation manifest entries字节码操作清单条目
【发布时间】:2013-11-19 10:17:32
【问题描述】:

我在做一些 Java 字节码修改教程很开心。他们都说我需要设置以下清单属性: 可以重新定义类:真 可以重新转换类:真 Can-Set-Native-Method-Prefix: true 完全没问题,但是没有任何教程解释属性的确切作用。 oracle 文档非常简洁,除了 Can-Set-Native-Method-Prefix: true 我假设它也允许检测本地方法,因为它们不能简单地更改为 Java 方法...

谁能解释一下类的重新定义和重新转换有什么区别?

【问题讨论】:

    标签: java instrumentation bytecode-manipulation javaagents


    【解决方案1】:

    首先,这些属性对于一般的字节码操作来说不是必需的。他们使用 JVM 的 instrumentation 功能为 Java 代理请求特殊功能。例如。通过组装字节码来创建新类在没有它们的情况下也可以工作。

    重新定义意味着代理将在任意时间点调用Instrumentation. redefineClasses 来更改现有(和已加载)类的实际定义。代理将为新定义提供字节码。

    重新转换是指类文件转换的过程,通常在类加载时应用。代理可以注册ClassFileTransformers,它们会被一个接一个地调用,以便在类初始化之前对字节码进行转换。所以重新转换是指JVM对已经加载的类重复这个过程的能力。在这种情况下,代理可以调用​​Instrumentation.retransformClasses,指定要重新转换哪些类,但不指定字节码。相反,JVM 将调用所有已注册的能够重新转换的ClassFileTransformers,提供实际的字节码(或链式转换器的前一个转换器的结果)。

    Setting a native method prefix 更特别;它在检测本机方法时可能很有用。

    所以你看,在玩字节码时,你不太可能总是需要所有这些功能。

    【讨论】:

    • 谢谢,这解释了我猜想的一切:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多