Java何时读取方法字节码?

Java何时读取方法字节码?,java,methods,jvm,bytecode,instrumentation,Java,Methods,Jvm,Bytecode,Instrumentation,因此,在插装过程中,我们注意到,当我们有一个方法foo并将字节码交换给它时,只有新的调用会对新的字节码进行操作,而交换不会影响该方法已经运行的实例 出于引用目的,这种行为是否有记录在案?一个明显的非答案:最好是这样 你看,在代码运行时交换方法的代码很可能导致不一致 如果旧版本有4个指令(如4个作业),而新版本有3个完全不同的作业,该怎么办。现在发生了四分之二的赋值,然后代码被交换。现在怎么办 此类热插拔活动的整体理念是而不是创建不一致的行为。您交换当前正在执行的代码的想法是一个很好的快速解决不一

因此,在插装过程中,我们注意到,当我们有一个方法
foo
并将字节码交换给它时,只有新的调用会对新的字节码进行操作,而交换不会影响该方法已经运行的实例


出于引用目的,这种行为是否有记录在案?

一个明显的非答案:最好是这样

你看,在代码运行时交换方法的代码很可能导致不一致

如果旧版本有4个指令(如4个作业),而新版本有3个完全不同的作业,该怎么办。现在发生了四分之二的赋值,然后代码被交换。现在怎么办

此类热插拔活动的整体理念是而不是创建不一致的行为。您交换当前正在执行的代码的想法是一个很好的快速解决不一致问题的方法

出于引用目的,是否在某处记录了该行为

是的。请参阅Javadoc以了解:

如果重新定义的方法具有活动堆栈帧,则这些活动帧将继续运行原始方法的字节码。重新定义的方法将用于新的调用


你能澄清你所说的“方法实例”是什么意思吗?以及“新调用”是什么意思?它是
existingInstance.foo()
还是
new Instance().foo()
?@Andrew让我们假设我调用一个方法
myinstance.foo()
,开始第一次运行(“Instance”)a。现在我同时交换该方法的字节码,然后再次调用
myinstance.foo()
,正在启动运行/实例B。
B
将运行新字节码,而
A
仍将运行旧字节码,直到返回。。。或者至少这是我们认为已经观察到的。问题是在哪里可以找到解释这种行为的文档。@GhostCat您通常会提供多少非答案?:)这就像我从你那里遇到的第4/5次-我真的不在乎,只是wondering@Eugene只要我认为合适。有足够多的人试图准确地回答被问到的问题,而不是考虑更大的问题。因此,我认为非答案和“大局”是我的利基;太好了,谢谢。我们正在使用
ByteBuddy
来注入字节码,但我猜最终它将不得不通过instrumentation api。