写在前面
本文看下使用javassist如何查看方法对应的字节码指令信息。
1:程序
- 测试类
package com.dahuyou.javassist.huohuo.cc;
import java.math.BigDecimal;
public class MyApiTestNoAnnotation {
public double queryUserInfo(String uId){
return BigDecimal.ONE.doubleValue();
}
}
- 插桩类
package com.dahuyou.javassist.huohuo.cc;
import com.dahuyou.javassist.huohuo.bb.ApiTest;
import com.dahuyou.javassist.huohuo.bb.RpcGatewayClazz;
import com.dahuyou.javassist.huohuo.bb.RpcGatewayMethod;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.bytecode.CodeAttribute;
import javassist.bytecode.CodeIterator;
import javassist.bytecode.MethodInfo;
import javassist.bytecode.Mnemonic;
public class MyDoItttt {
public static void main(String[] args) throws Exception {
ClassPool pool = ClassPool.getDefault();
CtClass ctClass = pool.get(MyApiTestNoAnnotation.class.getName());
// 获取方法的自定义注解
CtMethod queryUserInfo = ctClass.getDeclaredMethod("queryUserInfo");
MethodInfo methodInfo = queryUserInfo.getMethodInfo();
CodeAttribute codeAttribute = methodInfo.getCodeAttribute();
CodeIterator iterator = codeAttribute.iterator();
while (iterator.hasNext()) {
int next = iterator.next();
// 注意:指令码就是一个整数,我们看到的load,ldc这些只是助记符,就像指令码是我们的身份证号,而助记符就是我们的名字
int code = iterator.byteAt(next);
System.out.println("指令码: " + next + " > " + Mnemonic.OPCODE[code]);
}
}
}
运行:
指令码: 0 > getstatic
指令码: 3 > invokevirtual
指令码: 6 > dreturn
Process finished with exit code 0
注意:指令码就是一个整数,JVM用的也是这个整数,我们看到的load,ldc这些只是助记符,就像指令码是我们的身份证号,而助记符就是我们的名字。
写在后面
参考文章列表
jvm之字节码 。