gpt4 book ai didi

java - 如何通过Java Agent保存检测后的java字节码?

转载 作者:行者123 更新时间:2023-12-02 12:53:10 25 4
gpt4 key购买 nike

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

Java Agent

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

最佳答案

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

实际上,您可以将代理检测的字节码保存到 .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 .

关于java - 如何通过Java Agent保存检测后的java字节码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44528565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com