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条)

报告相同问题?

悬赏问题

  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持