2013-07-23 3 views
1

메서드 호출에 대한 인수를보고 싶습니다. 그래서 foo를 호출하는 경우 :메서드 호출에서 변수/상수 값에 액세스

x = 4; 

y = 5; 

... 

foo(x, y, 20, 25); 

내가 인수 (4,5,20,25) 내가 메소드가 호출되기 전에 이러한 인수가 스택에 밀어 이해를 인쇄 할. 메서드의 로컬 변수 배열에서 값 (초기화되었거나 상수 인 경우)을 얻으려면 어떻게해야합니까?

visitVarInsn() 및 VarInsnNode에는 배열의 실제 값을 조회 할 수있는 방법이 없습니다.

분석기와 해석기를 사용해야합니까? 아니면 더 쉬운 방법이 있습니까?

편집 : 어떻게하는지 알아 냈습니다. 바이트 코드 명령어 인수를 설명하기 위해 BasicValue 및 BasicInterpreter를 수정했습니다. 그래서 BIPUSH와 같은 명령어를 나타내는 값에는 유형 정보 만이 아니라 푸시 된 값에 대한 정보가 들어 있습니다. 방법 foo는 인터페이스의 방법으로 클래스에 속하는 경우

foo는 당신이 사용할 수 있습니다 - 프레임은 분석기

+0

해결하려는 문제는 무엇입니까? – Bohemian

+0

컴파일 타임에 (프로그램을 실행하지 않고) 또는 런타임에 인수를 정적으로 찾고 싶습니까? (두 번째 beeing 훨씬 쉽게) – ruediste

+0

나는 그들을 정적으로 찾을 필요가있다. 초기화 된 것인지 아닌지와 초기 값만 알면됩니다. – zaz

답변

0

이 ASM 바이트 코드 조작과 관련, 그러나 다만 경우에 아니에요과 같은 방법으로 검사합니다 Proxy 인터페이스 구현을 래핑하고 메소드 이름을 가로 채기.

또한 this 대답은 ASM 바이트 코드 수정에 유용합니다.

1

메서드 호출 (20 및 25)에 직접 전달되는 상수 값은 정적으로 쉽게 검색 할 수 있습니다. 결과적으로 visitIntInsn에서 읽을 수있는 푸시 지침이 생깁니다. 값이 작 으면 visitInsn으로 catch 할 수있는 const 명령어가 생기므로 visitLdcInsn으로 큰 값을 포착 할 수 있습니다.

정적으로 메서드 호출 시점에서 변수에 바인딩 된 값을 결정하는 것이 일반적으로 가능하다고 생각하지 않습니다. 각 변수에 대해 가능한 값의 범위를 제공 할 수 있어야하는 데이터 흐름 분석 (분석기 및 해석기 사용)이 필요할 것입니다. 이것은 일반적인 경우에 명확한 값을 제공하지 않지만, 한 번만 할당되거나 여러 번 할당 된 변수의 경우에는 무조건적으로 사용됩니다.