2012-06-07 6 views
0

BCEL 라이브러리에서 주어진 InvokeInstruction에 대한 호출 수신자의 MethodGen을 확인하려고합니다. 문제는 InvokeInstruction을 사용하여 호출하려고하는 MethodGen에 연결하는 방법을 모른다는 것입니다. 나는이 프로그램의 주요 방법에 대한 BCEL MethodGen 객체가있는 경우InvokeInstruction (BCEL)에 의해 호출 된 메소드를 결정하는 방법은 무엇입니까?

, 나는 명령의 목록을 가서 InvokeInstructions있는 것을 찾을 수 있습니다

// Assume MethodGen mainMG is given to us 
Instruction[] insns = mainMG.getInstructionList().getInstructions(); 
for(Instruction insn : insns) { 
    if(insn instanceof InvokeInstruction) { 
     // great, found an invoke instruction 
     InvokeInstruction invoke = (InvokeInstruction)insn; 

     // what do I do with it now? 
    } 
} 

BCEL의 문서 중 일부

위대하고 다른입니다 부품이 부족합니다. 호출되는 메소드의 MethodGen에 InvokeInstruction을 연결하는 방법에 대한 제안 사항이 있습니까?

단순화하면 프로그램에 다형성이 없다고 가정 할 수 있습니다. 어느 시점에서 나는 그것을 (보수적으로) 다루어야 만 하겠지만.


명확한 설명 : I (예 invoke.getCalledMethodGen())이 작업을 수행하는 직접 경로가 아닌 실현,하지만 난합니다 (호출 명령에서 예를 들어, 방법의 충분한 별개의 정보를 얻을 수있는 방법이 있는지 궁금 FQN 또는 equiv.) 호출 할 메서드를 다시 연결할 수 있습니다.

답변

0

일반적으로 할 수 없습니다. BCEL 및 단일 클래스에서 작동하는 바이트 코드 작업을위한 기타 프레임 워크 따라서 사용 가능한 모든 클래스를 읽고 (게으르게 수행 할 수 있음) MethodGens의 자체 저장소 (예 : MethodGen 인스턴스에 대한 FQN 메소드 이름의 맵)를 빌드해야합니다.

+0

내가 지금까지 가지고있는 것을 바탕으로, 나는 그지도를 아주 쉽게 만들 수있다. 나는 방법의 FQN을 얻을 수있는 방법이 있는지 찾아 내기를 원한다고 생각한다. – jbranchaud

+0

invoke.getType (cpg) .getSignature() + "."를 사용해보세요. + invoke.getSignature (cpg) –

+0

이것들은 특정 메소드 호출의 리턴 타입에 대한 정보를 제공합니다. 그러나,'invoke.getName (cpGen);'은 호출 된 메소드의 이름을 알려줍니다. 이제 메소드를 포함하고있는 클래스가 무엇인지를 좁혀 야합니다. – jbranchaud