写在前面
本文看下如何修改返回值。
代码
- 需要增强的类:
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.*;
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();
// 操作常量池
ConstPool constPool = methodInfo.getConstPool();
Bytecode bytecode = new Bytecode(constPool); // 创建指令码
bytecode.addDconst(0); // double 推送到操作数栈的栈顶
bytecode.addReturn(CtClass.doubleType); // 返回double类型的结果
methodInfo.setCodeAttribute(bytecode.toCodeAttribute()); // 设置到方法指令码中
ctClass.writeFile();
}
}
运行查看生成的字节码,返回值被修改为了0D
: