2012-04-11 11 views
0

Java 클래스 A의 .class 파일이 주어지면 주어진 바이트 코드 시퀀스를 추출하는 방법 (예 : BCEL, ASM 등)이 있습니다 (기본 블록이라고 가정) , 별도의 위치에 배치하고 나중에 해당 바이트 코드 시퀀스를 실행합니까?임의의 순서의 Java 바이트 코드 추출 및 실행

예 : 소스 코드에 ... a + = b; b + = 21; . .

바이트 코드 표현에만 액세스 할 수 있습니다. 그 바이트 코드를 추출하여 블랙 박스로 취급하고 싶습니다. 클래스 A의 지시에서 소스 라인 'a + = b;'대신 적절한 누락 바이트 코드 시퀀스를 보유하는이 외부 블랙 박스 X를 가리 키기를 원합니다. 나는 블랙 박스에 필요한 모든 변수를 스택 프레임에 제공하고 싶다. (예를 들어, a, b, 아마도 블랙 박스 X에서 사용되는 메소드 매개 변수의 현재 값 ...) 그리고 바이트 코드 시퀀스 실행 후, 블랙 박스는 새로 업데이트 된 프레임 변수와 함께 원래 클래스 A로 제어를 되돌립니다.

어떤 아이디어 주셔서 감사합니다.

편집 :

아래의 제안으로, 블랙 박스가 가장 합리적 스텁 클래스 파일의 내부 스텁 방법이 될 것입니다. 그런 다음 질문은 다음과 같이됩니다.이 명령 시퀀스에서이 잘 구성된 스텁 클래스 및 메서드를 가장 합리적으로 어떻게 만들고 원래 클래스 A에서 컨트롤을 전송하는 방법이 이상적으로 컴파일시 '오프라인으로'수행됩니다. 시각.

답변

1

까다로운 부분은 명령 순서를 식별하는 방법입니다. 시퀀스의 시작과 끝 부분에서 줄 번호 또는 마커 메서드 호출을 사용하여이를 수행 할 수 있습니다.

ASM의 분석 패키지를 사용하여 로컬 변수 유형과 스택 슬롯을 계산하고 바이트 코드 시퀀스를 복사 할 메소드의 매개 변수로 사용할 수 있습니다.

article from AOSD'07은 ASM에서 좋은 출발점을 제공해야합니다. 메서드 바디 및 인라인 메서드 섹션을 바꾸십시오. 사용법이 필요한 것과 매우 유사한 변환을 설명합니다.

+0

위대한 기사. ASM이 훌륭한 도구 인 이유는 훌륭한 문서 때문입니다. – ChaimKut

2

Java의 JVM 스펙 준수 구현에서 바이트 코드를 실행하는 유일한 방법은 바이트 코드를 (잘 구성된) 클래스 파일에 넣고 해당 파일을로드하는 것입니다. 즉, 바이트 코드가 갈 수있는 유일한 장소이기 때문에 클래스 파일의 "메소드"에 바이트 코드를 래핑해야합니다.

또한 바이트 코드는 모든 안전 규칙을 준수해야합니다 바이트 코드 검증 자에 의해. 그것은 임의의 순서를 실행할 수있는 능력을 제한하게 될 것입니다.

바이트 코드 시퀀스가 ​​무엇인지 알아 내려고한다면,이를 직접 실행하거나 바이트 코드 에뮬레이터를 사용하는 것이 좋습니다.