Java 프로그램 용 바이트 코드 계측을 수행하기 위해 ASM을 사용하고 있습니다. 내가하고있는 일은 간단하다. - 메소드를 인스트루먼트 할 때, 명령어가 PUTFIELD이면 명령어 바로 앞에 DUP_X1을 수행 한 다음 PUTFIELD를 방문하고 DUP의 스택 항목을 포함하는 인수로 함수 호출을 삽입한다.자바 검증기 오류를 생성하는 바이트 코드 계측
public void setA(ClassA classa)
{
refA = classa;
eyeColor = classa.eyeColor;
}
public void setA(ClassA classa)
{
ASide.updateG(refA = classa, this);
ASide.updateG(eyeColor = classa.eyeColor, this);
}
을하지만이 계측 코드를 실행하면, 내가 얻을 :
java.lang.VerifyError을 : 기대하는 것은 찾을
public void visitFieldInsn(
int opcode,
String owner, // owner of this field...
String name,
String desc) {
boolean did_dup = false;
if(opcode == Opcodes.PUTFIELD) {
if(!owner.equals("java/lang/System")) {
if (desc.startsWith("L")) {
mv.visitInsn(Opcodes.DUP_X1);
did_dup = true;
}
}
}
mv.visitFieldInsn(opcode, owner, name, desc);
if (did_dup) {
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/amir/ASide", "updateG", "(Ljava/lang/Object;Ljava/lang/Object;)V");
}
}
는 코드는 전에 각각 계측, 후에 다음과 같다 스택에 객체/배열
제공 할 수 있습니까?
수정 된 setA 메소드에 관해 불평하고 있습니까? –
setA 방법에 대해 불평하지 않습니다. 마틴입니다. 예리한 관찰입니다. 내가 진정으로 불평하는 방법을 조사해야한다고 생각합니까? 내부 클래스와 관련이있는 것으로 보입니다. –
이것은 내부 클래스와 관련이 있습니다 - 그러나 왜 그 것이 중요한지 확실하지 않습니다 –