问题描述
我正在尝试在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_INDEX
和STOPTIME_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 (将#修改为@)