方法开始和结束时的检测 SampleJar.java Sender.java EntityModifier.java

问题描述

我正在尝试在jar中方法的开头和结尾添加某些指令。 以下是我打算在SampleJar类中实现的目标

SampleJar.java

package sample;
import snd_pkg.Sender;

public class SampleJar {

public static void func(){
    long l1=System.nanoTime(); //Instruction to be inserted
    /*
     * Existing instructions
     */
    long l2=System.nanoTime();  //Instruction to be inserted
    (new Sender()).send(l1,l2); //Instruction to be inserted
   }
}

Sender.java

package snd_pkg;

public class Sender {
 public  void send(long start,long stop)
   {
       //do something
   }
}

下面是我在EntityModifier类中尝试过的内容

EntityModifier.java

public class EtityModifier extends AdviceAdapter {


protected EtityModifier(int api,MethodVisitor methodVisitor,int access,String name,String descriptor) {
    super(api,methodVisitor,access,name,descriptor);
    
}

private final static int STARTIME_INDEX = 100;
private final static int STOPTIME_INDEX = 102;


@Override
protected void onMethodEnter() { 
    // Invoking the nanoTime method
    mv.visitMethodInsn(INVOKESTATIC,"java/lang/System","nanoTime","()J",false);
    // Storing long type value at STARTIME_INDEX
    mv.visitvarInsn(LSTORE,STARTIME_INDEX);
}

@Override
protected void onMethodExit(final int opcode) {
    if (opcode == RETURN || opcode == ARETURN || opcode == DRETURN || opcode == FRETURN || opcode == IRETURN
            || opcode == LRETURN) {
        // Invoking the nanoTime method
        mv.visitMethodInsn(INVOKESTATIC,false);
        // Storing long type value in a local variable at STOPTIME_INDEX
        mv.visitvarInsn(LSTORE,STOPTIME_INDEX);
        // create Sender object
        mv.visitTypeInsn(NEW,"snd_pkg/Sender");
        // dup
        mv.visitInsn(DUP);
        // call Sender Constructor
        mv.visitMethodInsn(INVOKESPECIAL,"snd_pkg/Sender","<init>","()V",false);
        // Loading startTime from STARTIME_INDEX
        mv.visitvarInsn(LLOAD,STARTIME_INDEX);
        // Loading stopTime from STOPTIME_INDEX
        mv.visitvarInsn(LLOAD,STOPTIME_INDEX);
        // call send Method
        mv.visitMethodInsn(INVOKEVIRTUAL,"send","(JJ)V",false);
    }
  }
}

我有一个exe,可以在运行时从SampleJar jar文件调用方法,但是在检测后,该exe无法启动。字节码似乎正确。它可以从STOPTIME_INDEX加载值,但从STARTIME_INDEX加载不能

最初使用 LocalVariablesSorter.newLocal() ,但是 newLocal() 提供的变量索引与其他现有局部变量之间似乎存在可变的插槽冲突在方法上。因此,分别为STARTIME_INDEXSTOPTIME_INDEX分别分配了100和102。

日志文件中的错误

java.lang.VerifyError: Bad local variable type
Type top (current frame,locals[100]) is not assignable to long

STARTIME_INDEX检索值似乎有问题。

这种方法有什么问题吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)