2012-06-20 4 views
0

다음은 몇 가지 코드입니다.ASM을 사용하여 메소드의 opcode를 Java 클래스 파일의 다른 메소드로 복사하는 방법은 무엇입니까?

static synchronized void q(ua paramua, int paramInt) { 
try { 
if (d) { if (paramInt > -16711936); 
    return; } 
if (q * 514194583 > 0) { if (paramInt > -16711936); 
    abf localabf = new abf(paramua); 
    n.d(localabf, -984409319); 
} 
else { 
    paramua.ma(false); 
} 
return; } catch (RuntimeException localRuntimeException) { throw aht.d(localRuntimeException, "ck.q(" + 41); 
} 
} 

static synchronized void b(ua paramua) 
{ 
    if (d) return; 
    if (q * 514194583 > 0) { 
    abf localabf = new abf(paramua); 
    n.d(localabf, -836239689); 
    } 
    else { 
    paramua.ma(false); 
    } 
} 

이 두 가지 방법은 동일한 동작을 수행합니다.

static synchronized void q(ua paramua, int paramInt) 
{ 
    if (d) return; 
    if (q * 514194583 > 0) { 
    abf localabf = new abf(paramua); 
    n.d(localabf, -836239689); 
    } 
    else { 
    paramua.ma(false); 
    } 
} 

가 어떻게이 작업을 수행 할 수 있습니다 ... 첫 번째 방법의 두 번째 매개 변수는 psudo 인수는, 그래서 원래의 코드를 삭제하고 같은이 방법을 만들고 싶어? 이렇게 해보았습니다.

destMethodNode.instructions.clear(); 
destMethodNode.instructions.add(srcMethodNode.instructions); 

그러나 null 포인터 예외가 발생합니다. 그 이유는 무엇입니까?

+0

소스를 편집하고 다시 컴파일합니다. 그것은 훨씬 더 일할 가능성이 높습니다. 귀하의 질문에 대답하기 위해 목록에 목록을 추가 할 수 없습니다. 아마도 addAll()이 의도 한 것입니까? –

+0

어셈블리가 왜 이와 관련되어 있습니까? – harold

+0

NPE에 대한 스택 추적을 제공해주십시오. –

답변

0

ASM의 project page에서 연결된 AOSD'07의 "두 클래스를 하나로 병합"섹션을 참조하십시오. MethodNode를 적절하게 사용하여 메서드의 바이트 코드를 다른 메서드로 복사하는 방법을 예제로 제공합니다.