나는 ASM와 함께 일하고 있으며 일부 필드 쓰기를 추적하기 위해 클래스 파일을 조작하려고합니다. putfield
및 putstatic
명령어는 ASM에서 FieldInsnNode
클래스의 인스턴스이며, 런타임시 Field 오브젝트를 생성하고이 Field
오브젝트를 인수로 사용하는 다른 메소드를 호출하는 코드를 주입하려고합니다.ASM에서 putfield 또는 putstatic 명령어의 Field 인스턴스를 가져올 수 있습니까?
나는 간단한 자바 소스 코드를 컴파일하여 몇 가지 실험을했다 : 다음
package com.test.simple;
public class Simple {
public int a,b;
public void foo() {
a = 20;
b = 10;
}
}
그리고 클래스 파일 검사 javap
를 사용 : 여기
$ javap -c -l Simple.class
Compiled from "Simple.java"
public class com.test.simple.Simple {
public int a;
public int b;
public com.test.simple.Simple();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 3: 0
public void foo();
Code:
0: aload_0
1: bipush 20
3: putfield #2 // Field a:I
6: aload_0
7: bipush 10
9: putfield #3 // Field b:I
12: return
LineNumberTable:
line 7: 0
line 8: 6
line 9: 12
}
내가 putfield
의 실제로 다음에 있습니다 찾을 수 있습니다 뭔가 같은 #2
, 내가 추측하는 상수 풀에 대한 참조입니다. 그래서 '돈 상수 필드에 대한 모든 세부 사항을 숨기고
그러나, ASM에, FieldInsnNode
단지 (name
, 즉 owner
desc
)을 3 개 필드가 (그리고 나는 와일더는 상수 Field
의 인스턴스가 실제로 추측이) 내 추측을 익히는 방법을 안다. 여기
내 질문은 : Field
객체는 상수 풀에 거짓말 경우
- , 어떻게 그것을 검색하고 ASM에 스택에 밀어 수 있습니까?
- 나는
Field
개체를 찾을 수없는 경우, (공용 생성자가Field
위해가 없기 때문에)Field
의 인스턴스를 인스턴스화FieldInsnNode.name
및FieldInsoNode.owner
를 사용 할 수 있다는 것입니다? - 위의 모든 작업을 수행 할 수 없다면, 나는 적어도
FieldInsnNode.name
을 인쇄 할 수 있으므로 적어도 어느 필드가 명령어 쓰기를하는지 알 수 있습니다. 하지만 모든 문자열도 상수 풀에있는 것처럼 보이므로 런타임시 String을 인스턴스화하는 몇 가지 지침을 어떻게 구축 할 수 있습니까?
내 링크는 ASM의 방문자 API를 가리키고 있지만 물론 ASM의 트리 API 동일한 개념을 따르므로 내 대답의 정보가 해당 API에 쉽게 적용될 수 있어야합니다. – Holger