0

ByteBuddy에서 바이트 코드의 일부 유형을 대체 할 수 있습니까? E. g. 내가 수업을ByteBuddy를 사용하여 바이트 코드의 유형을 대체하십시오.

class MyClass { 
    Foo makeFoo() { 
     return new Foo(); 
    } 
} 

이 경우 내가

class MyClass { 
    Bar makeFoo() { 
     return new Bar(); 
    } 
} 

에 해당 있도록 내가이 클래스의 바이트 코드를 변환 할 수 있습니다. 이자형. Foo의 모든 어커런스를 Bar으로 바꿉니다.

+1

ByteBuddy는 ASM에 정착하여 특정 유스 케이스에 대해 더 쉬운 인터페이스를 제공하지만, 유형의 발생을 대체하는 것은 이러한 사용 사례가 아니라고 생각합니다. ASM이 클래스의 상수 풀만 처리함으로써 모든 발생을 쉽고 효율적으로 대체 할 수 있으므로 ASM이 이러한 유형의 작업에 최선의 선택이 아닌 것으로 생각할 수도 있습니다. ASM은 직접 지원하지 않습니다. – Holger

답변

1

홀거 (Holger)가 제안했듯이 이것은 바이트 버디 (Byte Buddy)가 성취하려고 시도하는 범위에 포함되지 않습니다. Byte Buddy는 코드 조작을위한 안전한 환경을 제공하려고 시도합니다. 귀하의 경우에는 BarFoo을 대신 할 수 있음을 검증해야합니다. 또한 스택 맵 프레임을 다소 비싸게 재 계산해야합니다.

Byte Buddy를 사용하려는 경우 기본으로 제공되는 ASM에 대한 액세스를 제공합니다. ASM은 그러한 일에 사용할 수있는 Remapper을 제공합니다. 이 작업을 원한다면 Byte Buddy없이 ASM을 사용하는 것이 좋습니다. Holger가 언급 한 것처럼 가장 효율적인 방법은 ASM이 지원하지 않는 Foo의 루트 참조 인 상수 풀 항목을 다시 작성하여 간단한 ASM 방문이 생성되지 않더라도 다른 방법을 찾고 싶어 할 수도 있습니다. 너무 많은 오버 헤드.