java - 使用 javasssist 打印实例变量

标签 java javassist

我必须在运行时修改以下类,以在每个方法末尾打印实例变量“count”的值。

package test.hib.javaassist;

import java.io.IOException;

import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.NotFoundException;

public class JavaAssistTest {

    int count;


    public void doSomething1(){
        count++;
    }

    public void doSomething2(){
        count++;
    }

    public void doSomething3(){
        count++;
    }

    public void doSomething4(){
        count++;
    }

}

以下是主类,我尝试在 javaassist 的帮助下更改字节码。

package test.hib.javaassist;

import java.io.IOException;

import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.NotFoundException;

public class Main {

    public static void main(String[] args) throws NotFoundException, CannotCompileException, IOException {

        ClassPool pool = ClassPool.getDefault();
        CtClass cc = pool.get("test.hib.javaassist.JavaAssistTest");
        CtMethod[] methods = cc.getDeclaredMethods();

        for(CtMethod method : methods){
            if(! (method.getName().equals("main"))){
                method.insertAfter("{System.out.println(count);}");
                //method.insertAfter("System.out.println($type);");
            }
        }

        cc.writeFile();

        System.out.println("Completed editting");

        JavaAssistTest test = new JavaAssistTest();
        test.doSomething1();
        test.doSomething2();
        test.doSomething3();
        test.doSomething4();

        System.out.println("Finished");

    }

}

目前正在打印

Completed editting
Finished

我想要打印

Completed editting
1
2
3
4
Finished

你能指出我代码中的错误吗?

最佳答案

Javassist API 在这里有点令人困惑。看一下 writeFile 的实现。它是 writeFile(".") 的快捷方式,它将类保存在程序目录中,而不是类路径中。您希望它覆盖原始类文件,但此方法不执行此操作。您的系统类加载器将无法找到更新的类文件。

您可以使用writeFile(String)手动将类文件保存在正确的位置,或者通过调用cc.toClass()强制加载修改后的类。在类加载器手动查找修改后的类之前强制加载它。

关于java - 使用 javasssist 打印实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40826339/

相关文章:

java - 什么是 Java NullPointerException?

java - 当事务类型为 JTA 时显式启动和提交事务有什么影响?

java - Hibernate 代理对象不适用于父类(super class)方法

java - 使用 Javassist 添加语句

java - 如何发布API?

java.io.文件 : accessing files with invalid filename encodings

javassist : cannot parse method body with parameterized Maps/Lists

java - 我们可以使用Javassist向类添加导入语句吗

java - 使用模式获取 Javassist 的所有类

java - 我想知道使用 Sonar 的最佳方法是什么?