从HotSpot臆造机源码了解Java的走访限制修饰符

253彩票

  • 首页
  • 首页
  • 最新资讯
  • 253彩票官网
  • 让建站和SEO变得简单

    让不懂建站的用户快速建站,让会建站的提高建站效率!

    栏目分类
    你的位置:253彩票 > 最新资讯 > 从HotSpot臆造机源码了解Java的走访限制修饰符
    从HotSpot臆造机源码了解Java的走访限制修饰符
    发布日期:2022-03-13 21:08    点击次数:63

     

    前边Ribbon源码分析著述,有读者留言发问:XX类是包独有的,重写不会报错吗?谜底其实是XX类并非包独有,而是一个protected的静态里面类,是以重写不会报错。

    对于Java走访限制修饰符的作用,笔者在入门Java时亦然靠记,写多了代码当然也就能清楚,但笔者很兴趣底层的斥逐,是以也尝试从HotSpot臆造机源码寻找谜底,解答我多年来的猜忌。

    类、字段、才气都有哪些走访限制修饰符?

    独有<private>、子类可走访<protected>、公开public、包独有<package>,默许不加走访限制修饰符即是包独有。

    走访范围 private package protected public 并吞个类 可走访 可走访 可走访 可走访 并吞包中的其他类 弗成走访 可走访 可走访 可走访 不同包中的子类 弗成走访 弗成走访 可走访 可走访 不同包中的非子类 弗成走访 弗成走访 弗成走访 可走访

    包独有<package>指的是唯一并吞个包下的类可走访,其它包下的类弗成走访。

    今天咱们就深切java臆造机去议论这些走访限制修饰符语意的斥逐。

    InstanceKlass是HotSpot VM中对应class文献结构的数据结构,InstanceKlass对象是一个Java类被HotSpot VM加载后所生成的C++对象,被存于才气区。咱们在Java代码中使用的Class对象推行是InstanceKlass的一个镜像。

    Java扶持使用"this."、"suppor."、"某个对象."调用一个才气,或"某个类."调用静态才气,在咱们看来是调用某个类的静态才气或者对象的才气,但这在臆造机中并不存在离别,都是一个才气调用。

    调用静态才气和对象才气的离别只在于,调用对象的才气需要在才气参数传递一个"this"援用,这是一个隐式参数,在编译器将Java代码编译成字节码时自动添加上。

    而Java代码中使用"this."、"suppor."调用本人才气和父类才气的不同,只是只是生成才气调用字节码提示的操作数指向的Methodref常量不同,才气的第一个隐式参数传递的对象都是并吞个。Methodref常量指代一个才气的象征援用,包括类名、才气名、才气形容符。

    咱们露出,类加载过程包括加载、邻接、运转机三个阶段,其中邻接阶段又可细分为考据、准备妥协析三个阶段。底下这张图有助于咱们清楚类加载的几个阶段,但并不准确。

    《Java臆造机标准》只是法则类加载需要完成的事情,而对规则并莫得严格的条款。

    下图为笔者阅读HotSpot臆造机类加载源码回来出的一张进程图,仅供参考。(如需要赢得原图,可在公众号回答:"hotspot")

    在HotSpot臆造机中,邻接阶段的准备阶段在加载阶段之后完成,邻接阶段的考据也分多种考据,其华文献形势考据、元数据考据在加载阶段交叉完成,而字节码考据阶段则在类运转机之前才触发,理会阶段则在类加载完成之后。

    引起类运转机的几条提示如new、getstatic、putstatic、invokestatic,臆造机在推论这些提示时,先判断类是否照旧运转机,未运转机则完成类的运转机,邻接阶段会在类运转机阶之前触发。

    邻接阶段的理会阶段是Java臆造机将常量池内的象征援用替换为径直援用的过程,凭据《Java臆造机标准》法则,在ane-warray、checkcast、getfield、getstatic、instanceof、invokedynamic、invokeinterface、invoke-special、invokestatic、invokevirtual、ldc、mulianewarray、new、putfield、putstatic这些条款操作数指向常量池中的象征援用常量(如:CONSTANT_Class_info、CONSTANT_Field_info、CONSTANT_Methodref_info)的提示推论之前,必须先对使用的象征援用进行理会。

    象征援用以一组象征形容援用的指标,如CONSTANT_Class_info暗示援用的类、CONSTANT_Field_info暗示援用哪个类的哪个字段、CONSTANT_Methodref_info暗示援用哪个类的哪个才气。

    象征援用考据发生在理会阶段,象征援用考据包括:通过字符串形容的全遗弃名是否能找到对应的类、在指定的类中是否存在浅薄称呼所形容的才气和字段、象征援用中的类、字段、才气的可走访性( 、public、 )。

    在HotSpot臆造机的斥逐中,对于阐发推论与动态调用(invokedynamic),理会阶段是在象征援用将要被使用前才去理会。

    才气调用源码:javaCalls.cpp; 邻接理会源码:linkResolver.cpp;

    // 查抄类 LinkResolver::check_klass_accessability // 查抄才气 LinkResolver::check_method_accessability // 查抄字段 LinkResolver::check_field_accessability 

    这些才气调用临了都调用Reflection类的对应verify才气完成是否可走访的判断,举例Reflection::verify_field_access才气。

    Java臆造机在理会class文献结构时、在字节码考据阶段,也会对走访限制修饰符进行考据。

    举例,在理会class文献结构时,考据是否大要吸收父类(Reflection::verify_class_access):

    类的走访修饰符决定了一个类是否不错被其它类走访。在理会class文献结构阶段,臆造机不错考据面前类是否大要吸收父类(父类的走访限制修饰符决定)、是否大要斥逐每个接口(接口的走访修饰符决定)。

    在字节码考据阶段则考据面前类是否不错走访指标类的protected修饰的才气或字段:

    在字节码考据阶段,臆造契机对类的每个才气中的每条字节码提示都会进行考据,但臆造机在字节码考据阶段,只对getfield提示做了check_protected考据。可见,字节码考据阶段莫得做过多的走访限制考据。

    本文转载自微信公众号「 Java艺术」,不错通过以下二维码关爱。转载本文请干系 Java艺术公众号。

     



    上一篇:没有了
    下一篇:建造边界仅338万,这个权力居品创了年内召募“记载”!