2014-05-09 4 views
1

매개 변수 defineClass가 호출되어 있는지 확인하고 defineClass를 호출하기 전에 바이트 배열 매개 변수에 메서드를 변환하는 바이트 코드를 호출합니다.변형시키는 호출 방법은 확실 동적으로로드 된 클래스 내 수업 변압기를 통해 실행되는 만들려고 노력하고 그것이 내가 뭘하려고 오전 클래스</p> <p>에로드되기 전에 내가 바이트 코드를 수정해야 그렇게하기 위해서입니다

그러나 각 매개 변수가 시작되는 위치를 식별 할 수 없지만 명확한 순서로되어 있습니다. 어떤 매개 변수가 시작되는지 알 수 있습니까?

여기 예는 나는 ASMifier

//The first parameter 
mv.visitVarInsn(ALOAD, 0); 
mv.visitVarInsn(ALOAD, 1); 
//second parameter, byte array, this is what I am looking for!! 
mv.visitVarInsn(ALOAD, 4); 
//third parameter 
mv.visitInsn(ICONST_0); 
//fourth parameter 
mv.visitVarInsn(ALOAD, 4); 
mv.visitInsn(ARRAYLENGTH); 
//fifth parameter 
mv.visitVarInsn(ALOAD, 0); 
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;"); 
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getProtectionDomain", "()Ljava/security/ProtectionDomain;"); 
mv.visitMethodInsn(INVOKEVIRTUAL, "b", "defineClass", "(Ljava/lang/String;[BIILjava/security/ProtectionDomain;)Ljava/lang/Class;"); 

로 만든 어떻게 내 변압기 사용을 통해 그것을 실행하기 위해 매개 변수로 defineClass는 주어진되고있는 바이트 배열을로드하고 그 지시하는 I detact 반환 값은?

나는 매개 변수 사이의 명확한 분리를 볼 수 없습니다, 나는이에 대한 모든 문서를 찾을 수 없습니다 ..

을 매개 변수가 끝날 때 나는 JVM 때 매개 변수의 시작과 노하우도 이해하지 않는 ..

바이트 배열 매개 변수 인덱스는 무엇인지 쉽게 추출 할 수 있지만 바이트 배열을로드하는 바이트 코드를 찾을 수 있다는 것을 아는 방법은 무엇입니까?

+0

바퀴를 새롭게 단장했습니다. ⟨[Instrumentation API] (http://docs.oracle.com/javase/7/docs/api/java/lang/instrument/package-summary.html)⟩ 이미 사용하기 전에 모든 클래스를 변형 할 수있는 방법을 제공합니다. – Holger

답변

0

두 방법은 이것에 있습니다

  1. 는 상기 스택
  2. 통로 값 (ASM 바이트 코드 조작기구로부터 SourceInterpreter를 사용 예) 스택에 소정의 값을 배치 (들)을 추적 방법 descriptor tells you 무엇 스택 각 슬롯에있어서의 P 사용되기 때문에, 이러한 값은

번째 방법은 구현하기 쉽다 (defineClass는 방법에 대해 예를 들어 오른쪽 INVOKEVIRTUAL 전에) 사용 가리 arameter. 그런 다음 스택에서 값을로드하고 자신의 용도로 복사 한 후 이전과 같이 되돌려 놓기 만하면됩니다.

ASM 바이트 코드 프레임 워크는 바이트 코드에 새로운 로컬 변수를 쉽게 도입 할 수 있도록 도와주는 LocalVariablesSorter 헬퍼를 제공합니다.