“失效”的private修饰符

这是小小本周的第五篇,本篇将会说到失效的private修饰符

前言

在Java编程里,使用private关键字修饰了一个成员,只有成员内部可以访问,其余成员都不可访问,今天说明一下private功能失效的问题。

失效之Java内部类

在一个内部类里访问外部类的private成员变量或者方法。

查看原因

使用javap命令查看一下生成的class文件

在这里有一个OuterClass方法,

根据注释,可以知道access1返回outerClass的region属性,并且这两个方法都接受OuterClass的实例作为参数,对这两个方法进行反编译。

下面代码调用access$0的代码,其目的是得到OuterClass的language 私有属性。

下面代码调用了access$1的代码,其目的是得到OutherClass的region 私有属性。

即,在内部类构造的时候,会有外部类的引用传递进来,并且作为内部类的一个属性,所以内部类会持有一个其外部类的应用。this$0就是内部类持有的外部类引用,通过构造方法传递引用并赋值。

继续失效

和上面一样,使用Javap反编译一下

编译器自动生成了一个access$0一次来获取x的值AnotherOuterClass.class的反编译结果

其中这句话,直接说明通过内部类的实例,获取到私有属性x的操作。

在官网文档中是这样说道的,如果(内部类的)成员和构造方法设定成了私有修饰符,当且仅当其外部类访问时是允许的。

如何保证不被访问

使用的方法相当简单,使用匿名内部类的方法实现

小明菜市场

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200925A00JDM00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券