这是小小本周的第五篇,本篇将会说到失效的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的操作。
在官网文档中是这样说道的,如果(内部类的)成员和构造方法设定成了私有修饰符,当且仅当其外部类访问时是允许的。
如何保证不被访问
使用的方法相当简单,使用匿名内部类的方法实现
小明菜市场
领取专属 10元无门槛券
私享最新 技术干货