使用javassist 无侵入实现方法时间统计
在JAVA 语言中 我们知道最终JVM执行的是字节码文件,那么 改变字节码指令 其实就是修改了代码执行逻辑.
今天我们就来介绍下 java中操作字节码的工具 javasst
javassist
一种简单易用操作字节码的工具类 —— [ 官方网站 ]
修改类中的实例方法
public class Student {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString(){
return "student";
}
}
通过javap 查看下 生成的字节码
javap -v Student
public java.lang.String toString();
descriptor: ()Ljava/lang/String;
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: ldc #31 // String student
2: areturn
LineNumberTable:
line 26: 0
LocalVariableTable:
Start Length Slot Name Signature
0 3 0 this Lsun/cn/demo/Student;
通过javassist api修改toString 方法
public class StudentByteCode {
public void modifyByteCodeMethod() throws Exception {
ClassPool pool = ClassPool.getDefault();
/** 获取类信息 */
CtClass cls = pool.get(Student.class.getCanonicalName());
/** 获取方法描述信息 */
CtMethod toStringMethod = cls.getDeclaredMethod("toString");
toStringMethod.insertBefore("System.out.println(\"toString before\");");
toStringMethod.insertAfter("System.out.println(\"toString after\");");
cls.writeFile(Student.class.getResource("../../../").getPath());
}
public static void main(String[] args) throws Exception {