JDK包下的String.class替换为我自己写的,被加载时会校验失败,请问是什么地方校验的?
13条回答 默认 最新
- GreyZeng 2021-05-13 16:11关注
请看这个回答:https://stackoverflow.com/a/23473601
> Hotspot had hardcoded assumptions about the field offsets of the various fields in java.lang.String. This means if you add fields to the String class which cause the class layouting logic to move the existing fields around you will break the JVM.
具体bug说明:https://bugs.openjdk.java.net/browse/JDK-6924259
具体的校验代码见:http://hg.openjdk.java.net/lambda/lambda/hotspot/rev/8f972594effc
具体的代码片段:
从第3109行的注释开始看:
// These functions exist to assert the validity of hard-coded field offsets to guard // against changes in the class files
校验方法见3112~3135行:即:
check_offset(const char *klass_name, int hardcoded_offset, const char *field_name, const char* field_sig)
这个方法
String的校验见3210~3219行:
// java.lang.String CHECK_OFFSET("java/lang/String", java_lang_String, value, "[C"); if (java_lang_String::has_offset_field()) { CHECK_OFFSET("java/lang/String", java_lang_String, offset, "I"); CHECK_OFFSET("java/lang/String", java_lang_String, count, "I"); } if (java_lang_String::has_hash_field()) { CHECK_OFFSET("java/lang/String", java_lang_String, hash, "I"); }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 2无用