如何解决方法开始和结束时的检测 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_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 举报,一经查实,本站将立刻删除。