如何通过Java代理保存检测的java字节码?

时间:2017-06-13 18:04:29

标签: java instrumentation javaagents

Java Agent提供了检测Java编程语言代码所需的服务。 ClassFileTransformer是Java Agent的实现,转换发生在JVM定义类之前。实现需要唯一的方法transform,并为每个新的类定义调用它。 Java Agent如何运作的说明:

Java Agent

我想保存已检测的代码,这样我就可以运行已检测的类文件而无需每次都进行检测。当我检查Interface Instrumentation时,我没有看到任何直接api来保存转换后的字节码。我想知道是否可以使用Java Agent来实现我的目标或其他一些工具?

1 个答案:

答案 0 :(得分:1)

您需要的是构建时或编译时检测,而不是运行时。大多数字节码检测工具都支持 - JavassistAspectJASM

实际上,您可以将代理检测的字节码保存到.class文件中,其结果只是表示类的字节数组。但是,您必须至少使用代理程序运行一次程序,并确保加载要检测的所有类,以便为每个类创建.class文件。所以我不推荐这种方法

if (shouldInstrument) {

    CtClass cclass = pool.get(className.replaceAll("/", "."));

    // Instrument the class here

    byte[] bytecode = cclass.toBytecode();

    File outputFile = new File(String.format("%s/%s.class", outputDirectory, className));
    Files.createDirectories(outputFile.getParentFile().toPath());

    try (FileOutputStream fos = new FileOutputStream(outputFile)) {
        fos.write(bytecode);
    }

    return bytecode;
}

此外,如果您的目标是在不使用样板代码污染源代码的情况下向自己的类添加某些功能,则可以操作源代码而不是字节码。来源 - >生成的源 - >字节码(编译)。例如,使用注释和自定义annotation processor