私はasm計測ライブラリを使用しています。 visitVarInsnを使用して、ローカル変数のインデックスを取得します。 私はそのインデックスを使用して、 変数とタイプの名前のようなより有用な情報を受け取りたいと思います。 あなたはどのように考えていますか?ありがとう。javaローカル変数 - インデックスを使用して変数名または型を取得する方法
2
A
答えて
0
LocalVariablesSorter.visitLocalVariable方法でそれを拾います。私は以下のコードを使用しています
2
:
private LocalVariableNode getLocalVariableNode(VarInsnNode varInsnNode, MethodNode methodNode) {
int varIdx = varInsnNode.var;
int instrIdx = getInstrIndex(varInsnNode);
List<?> localVariables = methodNode.localVariables;
for (int idx = 0; idx < localVariables.size(); idx++) {
LocalVariableNode localVariableNode = (LocalVariableNode) localVariables.get(idx);
if (localVariableNode.index == varIdx) {
int scopeEndInstrIndex = getInstrIndex(localVariableNode.end);
if (scopeEndInstrIndex >= instrIdx) {
// still valid for current line
return localVariableNode;
}
}
}
throw new RuntimeException("Variable with index " + varIdx + " and scope end >= " + instrIdx
+ " not found for method " + methodNode.name + "!");
}
一般的な問題は、ローカル変数のインデックスを再利用することができるということです。したがって、特定のインデックスに対して正しいLocalVariableNodeを取得していることを確認する必要があります。これを行うには、指定された変数が使用されているコード位置で有効であることを確認する必要があります。
開始位置は、変数が定義された後に次のコード行であるため、問題は、あなたが行番号を使用することができないということです。空行とコメントは無視されるため、これは後続の行になります。しかし、コードは既存の変数を再利用できるので、これは現在の行の前の任意の行でもかまいません。
終了位置は、開始位置の直前(例えば、ループ内)にすることができる。
コードが行情報なしでコンパイルされている可能性があります。
したがって、常に正しい命令インデックスを使用する必要があります。しかし、外部からアクセスできないAbstractInsnNodeの内部情報です。この問題を回避するために、次のコードを使用します。これは明らかにカプセル化を破るもので、さまざまな理由で推奨できません。あなたが何か良いことを考え出すなら、私に知らせてください!一方で、この作品:
private int getInstrIndex(AbstractInsnNode insnNode) {
try {
Field indexField = AbstractInsnNode.class.getDeclaredField("index");
indexField.setAccessible(true);
Object indexValue = indexField.get(insnNode);
return ((Integer) indexValue).intValue();
} catch (Exception exc) {
throw new RuntimeException(exc);
}
}
関連する問題
- 1. は、変数名、変数の値を取得する方法
- 2. jvmtiを使用してメソッドのローカル変数とクラス変数の値を取得する方法
- 3. GDB/MIを使用して変数の基本型を取得する方法
- 4. Javaで変数名を取得する
- 5. 別の変数を使用して変数の名前を取得する方法は?
- 6. WebdriverIOを使用してウィンドウ変数を取得する方法
- 7. ローカル変数を使用したLDAPフィルタリングを使用したADユーザの取得
- 8. バッチファイルを使用して変数にファイル名を取得する
- 9. ストアドプロシージャを使用して出力変数の数を取得する方法は?
- 10. 関数に発行される変数のローカル名を取得
- 11. FileMaker Pro 15を使用してスクリプト内のローカル変数またはグローバル変数の値を返す方法
- 12. 匿名関数を使用してマウスオーバーを割り当てる際にローカル変数を渡す方法は?
- 13. 変数名の一部を関数に渡して変数名を取得する方法
- 14. ローカル変数を型として使う方法は?コンパイラは「変数ですが型のように使用されています」
- 15. 名前を使用してJavaで変数にアクセスする方法は?
- 16. PHPでアンパサンドを使用する方法URL変数(または関数の引数)を取得しますか?
- 17. 角度 - ローカルPHPファイルから変数を取得する方法
- 18. rubyスクリプト間でローカル変数を取得する方法
- 19. オブジェクト型環境変数を取得する方法は?
- 20. ローカル変数をBash関数で使用する方法
- 21. R関数で変数名を取得する方法
- 22. リフレクションを使用して引数名を取得する方法
- 23. ローカル変数の取得
- 24. ByRef Linqを使用したローカル変数
- 25. RTTIを使用して変数名を取得
- 26. コード内の(ローカル変数 '...'は使用されない)ローカル変数の前景色を変更する方法
- 27. javaの別のメソッドでローカル変数の値を取得する
- 28. 変数オブジェクト名を使用してユーザーフォームフレームをループする方法
- 29. Javaの他の変数の名前として変数を使用する
- 30. ダンプとシンボルファイルから変数名を取得する方法は?
私は以前visiLocalVariableを使用して試してみましたが、私は、変数へのすべてのアクセスを監視したいとvisitLocalVariableは、ローカル変数は – tomermes
右宣言されたときにのみ呼ばれていました。これをビジターパターンで使用する場合は、indexから変数名へのマップを自分で保守する必要があります(visitLocalvariableへの呼び出しに基づいて)。もちろん、 – aioobe
です。ありがとう。 – tomermes