0

AT/AFTER nth read、AT/AFTER nth write などの追跡変数のような場合に特にどのように機能するかを理解するために、バイトマンの実装を調べていました。実装では、指定されたルールと一致するかどうかを確認するために、クラスを 2 回読み取ります。ユーザーが RuleCheckMethodAdapter を使用し、2 回目は RuleTriggerAdapter を使用してクラス内の関心のある場所に実際にバイトコード (トリガー) を挿入します。私が理解できなかったのは、なぜ 2 つのパスが必要なのかということです。ルールに一致する場合、最初のパス自体でトリガーを追加できないのはなぜですか? 同じことに関する洞察は役に立ちます。

4

1 に答える 1

0

すべての位置タイプのすべての射出段階で 2 つのパスが使用されます。最初のパスは、場所がメソッド バイトコードの特定のポイントのコードと実際に一致することを確認する検証ステップです。その場所で注入を適切に実行できるようにするために必要な情報を記録し、2 回目のパスで使用するために保存します。nb この最初の段階は、常に非常に安価で迅速なコード スキャンです。

第 2 段階では、コード構造、抽象的なマシン スタックのレイアウトとタイプなどに関するより多くの情報を追跡します。注入された領域外の例外。ルールが適用されることが明確になるまで、このオーバーヘッドが発生しても意味がありません。

于 2020-07-20T14:27:55.370 に答える