对于 java 中的字节码检测,有 asm 框架以及 bcel 和 javaassist 库。
但是我需要在本机代码中进行检测,因为在 javaagent 运行时已经加载了一些 java 类,例如 java.lang.Thread、java.lang.Class 等
是否有任何用于在本机代码中检测 java 类的库?
编辑:似乎有一点混乱。
我想要的是:创建一个本地 java 代理,它使用 JVMTI apis 在加载类时使用 OnClassLoad 事件挂钩来更改类的字节码。
对于 java 中的字节码检测,有 asm 框架以及 bcel 和 javaassist 库。
但是我需要在本机代码中进行检测,因为在 javaagent 运行时已经加载了一些 java 类,例如 java.lang.Thread、java.lang.Class 等
是否有任何用于在本机代码中检测 java 类的库?
编辑:似乎有一点混乱。
我想要的是:创建一个本地 java 代理,它使用 JVMTI apis 在加载类时使用 OnClassLoad 事件挂钩来更改类的字节码。
我在博士研究期间遇到了这个问题。最适合我的答案是使用 java 库(我使用 ASM)在单独的 JVM 中执行字节码修改。
我使用 JVMTI 类加载挂钩来捕获类文件并使用 tcp 连接将其传输到单独的 JVM。一旦在单独的 JVM 中修改了类,我将其返回给 JVMTI 代理,后者将其复制到 VM 内存中并将指向修改后的类文件的指针返回给 JVM。
我发现在同一个 JVM 中编织类太难了,因为我想要修改的系统类文件(例如 java.lang.Object)必须在我需要执行编织的任何类文件之前加载. 在确定最终使用的单独 JVM 方法之前,我寻找 c/c++ 字节码库但没有取得多大成功。
您可以使用 weaver JVM 的主机名/端口参数化 JVMTI 代理,或者您可以使用某种形式的发现,具体取决于您的要求。
JIT 会将字节码转换为本机代码。如果你想生成原生代码,你需要让 JIT 来做,或者编写通过 JNI 调用的原生代码。
也许您想要实现的目标可以通过另一种方式更简单地完成。
创建一个本机 Java 代理,它使用 JVMTI api 在加载类时使用 OnClassLoad 事件挂钩更改其字节码。
虽然你不需要做你想做的事。为什么要使解决方案比需要的更复杂(并且不太可能起作用)?
一旦加载了类,就不能更改其字节码。您可以确保仪器在加载之前运行,或者您可以创建一个新的 ClassLoader,并通过不询问父类来重新加载其中的类。但是,您不能将这些类与在 ClassLoader 之外加载的代码一起使用,因为该代码将引用较早加载的、未更改的类。