根据维基百科,有 3 个类加载器。
Boot Class-Loader 加载 RT.jar 和 /../jre/lib 中的所有内容
然后是扩展类加载器和系统类加载器。
我只对 Boot 类加载器感兴趣,因为我想挂钩它并在 RT.jar 中重新定义一个类,而不会出现-Xbootclasspath:/p
.
文档:http : //docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html
注意:不应部署使用此选项覆盖 rt.jar 中的类的应用程序。这样做会违反 Java 2 Runtime Environment 二进制代码许可。
和这里的许可证:http : //www.oracle.com/technetwork/java/javase/downloads/jre-6u21-license-159054.txt
状态:
C. Java 技术限制。您不得创建、修改或更改以任何方式标识为“java”、“javax”、“ sun”或 Oracle 在任何命名约定指定中指定的类似约定。
所以我在想,如果我可以通过 C++ 从本机代码中挂钩引导类加载器,我可以通过挂钩JVM_DefineClass
函数来替换一个类,JVM.dll
而不会有任何法律问题。
该函数具有签名:
JNIEXPORT jclass JNICALL JVM_DefineClass(JNIEnv *env, const char *name, jobject _loader, const jbyte *buf, jsize len, jobject pd)
- 1:这个函数真的在JVM启动时被调用吗?
- 2:如果我上钩了,我仍然会违反许可证吗?
- 3:我是挂钩了正确的功能还是应该做其他事情(也许是更好的方法?)?