Java 来自``Class``实例的jimple表示

Java 来自``Class``实例的jimple表示,java,class,instrumentation,java-bytecode-asm,soot,Java,Class,Instrumentation,Java Bytecode Asm,Soot,我需要热交换各种类的方法实现(在运行时的某个时候我才知道它们的新实现,它们可能会再次发生变化) ByteBuddy可以很容易地做到这一点,但它(显然)除了拦截方法之外,对方法没有多大作用,这就是为什么它附带了ASM 基本用法是 ByteBuddyAgent.install(); byte[] bytes = transformFoo(); ClassFileLocator classFileLocator = ClassFileLocator.Simple.of(Foo

我需要热交换各种类的方法实现(在运行时的某个时候我才知道它们的新实现,它们可能会再次发生变化)

ByteBuddy
可以很容易地做到这一点,但它(显然)除了拦截方法之外,对方法没有多大作用,这就是为什么它附带了ASM

基本用法是

    ByteBuddyAgent.install();
    byte[] bytes = transformFoo();

    ClassFileLocator classFileLocator = ClassFileLocator.Simple.of(Foo.class.getName(), bytes);
    new ByteBuddy()
            .redefine(Foo.class, classFileLocator)
            .make()
            .load(Foo.class.getClassLoader(), ClassReloadingStrategy.fromInstalledAgent());
在哪里

正在使用ASM

但是ASM很乏味,很难阅读和编写更复杂的代码。 因此,我更愿意使用Jimple,因为它为if STMT等提供了抽象

因此,我们的想法是从

Class<?> fooClass = Foo.class;
,在那里转换方法,并以某种方式将其编译回
byte[]

byte[] ret = ...
return ret;
s、 t.
ByteBuddy
可以重新加载该类

简而言之:

我想从
创建一个可转换的
SootClass
,并将其编译成我可以传递的
字节[]

我该怎么做

更新


似乎建议hot执行从
SootClass
byte[]
的转换,但到目前为止,我还没有找到任何有助于从
Class
SootClass
转换的文档或示例。大多数示例似乎只在类加载之前对其进行一次指令插入。

多年前我自己也尝试过,但失败了。我想说这在理论上是可能的,但这并不容易


一个问题是,当您尝试动态地为类添加工具时,通常需要在加载时使用java.lang.instrument来完成。这意味着您一次只能看到一个类,因为您实际上是在连接类加载过程。然而,对于烟尘所做的许多事情,它需要访问其他类。例如,它需要解析签名,有时还需要解析方法体。然后,这将完全改变加载类的集合以及加载它们的顺序。我记得这引起了不少问题。ASM没有这样的解决方案。

我自己多年前就尝试过,但失败了。我想说这在理论上是可能的,但这并不容易


一个问题是,当您尝试动态地为类添加工具时,通常需要在加载时使用java.lang.instrument来完成。这意味着您一次只能看到一个类,因为您实际上是在连接类加载过程。然而,对于烟尘所做的许多事情,它需要访问其他类。例如,它需要解析签名,有时还需要解析方法体。然后,这将完全改变加载类的集合以及加载它们的顺序。我记得这引起了不少问题。ASM没有这样的解决方案。

你可以用一句话来替换你的整个问题文本:“我如何才能从
创建一个可转换的
SootClass
,并将其编译成一个我可以传递的字节[],而不改变你问题中的信息量?”。无论是您无关的代码示例还是您对ASM的看法,都不要添加任何与之相关的内容。相反,您应该重点解释什么是“可转换的
SootClass
”,它与普通的
SootClass
有何不同,或者您尝试过什么,以及在哪里遇到了问题。@Holger感谢您的评论。当然,我可以删除一些关于动机的内容,但是我会收到一些评论,比如“你为什么要这样做”、“不要这样做”、“你确定你不能这样做吗?”。保持在那里应该避免“你在做什么”之类的评论,同时让那些确实想提出替代方法的人更好地判断他们的建议是否可行。至于我的问题,我根本找不到任何关于如何在类被加载后将其加载到So烟尘中的信息。更新了问题以添加该部分。当您有特定于烟尘的问题时,您不必解释为什么不使用ByteBuddy或ASM。只要没人知道你想做什么,没人会问你为什么要这么做。同样,什么是“可转换的
SootClass
”,它与普通的
SootClass
有何不同?Atm,它看起来像是在问如何从字节码处理工具中获取字节码数组,所以如果该工具的主要文档中没有涉及到这一点,那么就有问题了。解释您的问题与的区别。您可以用一句话替换整个问题文本:“如何从
创建一个可转换的
SootClass
,并将其编译为一个字节[]我可以传递?”而不必更改问题中的信息量。无论是您无关的代码示例还是您对ASM的看法,都不要添加任何与之相关的内容。相反,您应该重点解释什么是“可转换的
SootClass
”,它与普通的
SootClass
有何不同,或者您尝试过什么,以及在哪里遇到了问题。@Holger感谢您的评论。当然,我可以删除一些关于动机的内容,但是我会收到一些评论,比如“你为什么要这样做”、“不要这样做”、“你确定你不能这样做吗?”。保持在那里应该避免“你在做什么”之类的评论,同时让那些确实想提出替代方法的人更好地判断他们的建议是否可行。至于我的问题,我根本找不到任何关于如何在类被加载后将其加载到So烟尘中的信息。更新了问题以添加该部分。当您有特定于烟尘的问题时,您不必解释为什么不使用ByteBuddy或ASM。只要没人知道你想做什么,没人会问你为什么要这么做。同样,什么是“可转换的
SootClass
”,它与普通的
SootClass
有何不同?自动取款机,看起来你是一个
SootClass fooSootClass = ...
byte[] ret = ...
return ret;