na_tion 2021-05-11 18:47 采纳率: 50%
浏览 441
已采纳

JDK中,String.class文件被替换问题

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

     

    具体的代码片段:

    http://hg.openjdk.java.net/lambda/lambda/hotspot/file/8f972594effc/src/share/vm/classfile/javaClasses.cpp

    从第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");
      }
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(12条)

报告相同问题?