当我尝试查找使用Javaagent的示例时,在大多数情况下,它们是使用字节码的示例。这些示例使用第三方库,例如Javaassist。
据我所知,Java中没有使用字节码的标准方法,在任何情况下,您都必须求助于这些库。
因此,在调用defineClass()
之前,我尝试在自己的自定义类加载器中使用这些库。而且,当然,它运行得很好。我可以用相同的方式更改字节码,就像使用ClassFileTransformer
的transform()
方法一样。
我是否正确理解Javaagents的另一个有用功能,那就是它们的主要功能?因为首先,javaagent给您提供了一个Instrumentation
对象,并且Java规范说instrument
包主要用于处理字节码。但是,如果我只能实现自己的类加载器(为什么在引入instrument
包之前很久就可以做到),为什么还要这样做呢?
最佳答案
Instrumentation API可以在运行时使用,而无需触摸代码或编译后的字节码。您可以检测每个已编译的Java程序(即使没有代码也可以)。
关于java - Javaagent。做什么的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18962239/