Java 什么时候读取方法字节码?
When does Java read method bytecode?
所以在检测期间,我们注意到当我们有一个方法 foo
并且我们为它交换字节码时,只有新的调用才会对新的字节码进行操作,而交换不会影响已经 运行 方法实例。
出于引用目的,是否在某处记录了该行为?
一个明显的非答案:最好是那样。
你看,交换方法代码 而 代码是 运行 很可能 导致不一致。
如果您的旧版本有 4 条指令(例如 4 条赋值),而新版本有 3 条完全不同的赋值怎么办?现在发生了 4 次分配中的 2 次,然后交换了代码。现在怎么办?
此类热插拔 活动的总体思路是不 造成不一致的行为。您交换当前正在执行的代码的想法是快速准确解决不一致问题的好方法。
For citing purposes, is that behaviour documented, somewhere?
是的,是的。请参阅 Instrumentation.redefineClasses:
的 Javadoc
If a redefined method has active stack frames, those active frames continue to run the bytecodes of the original method. The redefined method will be used on new invokes.
所以在检测期间,我们注意到当我们有一个方法 foo
并且我们为它交换字节码时,只有新的调用才会对新的字节码进行操作,而交换不会影响已经 运行 方法实例。
出于引用目的,是否在某处记录了该行为?
一个明显的非答案:最好是那样。
你看,交换方法代码 而 代码是 运行 很可能 导致不一致。
如果您的旧版本有 4 条指令(例如 4 条赋值),而新版本有 3 条完全不同的赋值怎么办?现在发生了 4 次分配中的 2 次,然后交换了代码。现在怎么办?
此类热插拔 活动的总体思路是不 造成不一致的行为。您交换当前正在执行的代码的想法是快速准确解决不一致问题的好方法。
For citing purposes, is that behaviour documented, somewhere?
是的,是的。请参阅 Instrumentation.redefineClasses:
的 JavadocIf a redefined method has active stack frames, those active frames continue to run the bytecodes of the original method. The redefined method will be used on new invokes.