成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

Java private修飾符失效的原因

瀏覽:141日期:2022-08-22 09:47:40

失效之Java內部類

在一個內部類里訪問外部類的private成員變量或者方法。

public class OuterClass { private String language = 'en'; private String region = 'US'; public class InnerClass { public void printOuterClassPrivateFields() { String fields = 'language=' + language + ';region=' + region; System.out.println(fields); } } public static void main(String[] args) { OuterClass outer = new OuterClass(); OuterClass.InnerClass inner = outer.new InnerClass(); inner.printOuterClassPrivateFields(); }}

查看原因

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

15:30 javap -c OuterClassCompiled from 'OuterClass.java'public class OuterClass extends java.lang.Object{public OuterClass(); Code: 0: aload_0 1: invokespecial #11; //Method java/lang/Object.'<init>':()V 4: aload_0 5: ldc #13; //String en 7: putfield #15; //Field language:Ljava/lang/String; 10: aload_0 11: ldc #17; //String US 13: putfield #19; //Field region:Ljava/lang/String; 16: return public static void main(java.lang.String[]); Code: 0: new #1; //class OuterClass 3: dup 4: invokespecial #27; //Method '<init>':()V 7: astore_1 8: new #28; //class OuterClassInnerClass 11: dup 12: aload_1 13: dup 14: invokevirtual #30; //Method java/lang/Object.getClass:()Ljava/lang/Class; 17: pop 18: invokespecial #34; //Method OuterClassInnerClass.'<init>':(LOuterClass;)V 21: astore_2 22: aload_2 23: invokevirtual #37; //Method OuterClassInnerClass.printOuterClassPrivateFields:()V 26: return static java.lang.String access0(OuterClass); Code: 0: aload_0 1: getfield #15; //Field language:Ljava/lang/String; 4: areturn static java.lang.String access1(OuterClass); Code: 0: aload_0 1: getfield #19; //Field region:Ljava/lang/String; 4: areturn }

在這里有一個OuterClass方法,

static java.lang.String access0(OuterClass); Code: 0: aload_0 1: getfield #15; //Field language:Ljava/lang/String; 4: areturn static java.lang.String access1(OuterClass); Code: 0: aload_0 1: getfield #19; //Field region:Ljava/lang/String; 4: areturn }

根據注釋,可以知道access0返回outerClass的language屬性,access1返回outerClass的region屬性,并且這兩個方法都接受OuterClass的實例作為參數,對這兩個方法進行反編譯。

15:37 javap -c OuterClassInnerClassCompiled from 'OuterClass.java'public class OuterClassInnerClass extends java.lang.Object{final OuterClass this0; public OuterClassInnerClass(OuterClass); Code: 0: aload_0 1: aload_1 2: putfield #10; //Field this0:LOuterClass; 5: aload_0 6: invokespecial #12; //Method java/lang/Object.'<init>':()V 9: return public void printOuterClassPrivateFields(); Code: 0: new #20; //class java/lang/StringBuilder 3: dup 4: ldc #22; //String language= 6: invokespecial #24; //Method java/lang/StringBuilder.'<init>':(Ljava/lang/String;)V 9: aload_0 10: getfield #10; //Field this0:LOuterClass; 13: invokestatic #27; //Method OuterClass.access0:(LOuterClass;)Ljava/lang/String; 16: invokevirtual #33; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 19: ldc #37; //String ;region= 21: invokevirtual #33; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 24: aload_0 25: getfield #10; //Field this0:LOuterClass; 28: invokestatic #39; //Method OuterClass.access1:(LOuterClass;)Ljava/lang/String; 31: invokevirtual #33; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 34: invokevirtual #42; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 37: astore_1 38: getstatic #46; //Field java/lang/System.out:Ljava/io/PrintStream; 41: aload_1 42: invokevirtual #52; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 45: return}

下面代碼調用access$0的代碼,其目的是得到OuterClass的language 私有屬性。

13: invokestatic #27; //Method OuterClass.access$0:(LOuterClass;)Ljava/lang/String;

下面代碼調用了access$1的代碼,其目的是得到OutherClass的region 私有屬性。

28: invokestatic #39; //Method OuterClass.access$1:(LOuterClass;)Ljava/lang/String;

即,在內部類構造的時候,會有外部類的引用傳遞進來,并且作為內部類的一個屬性,所以內部類會持有一個其外部類的應用。this$0就是內部類持有的外部類引用,通過構造方法傳遞引用并賦值。

final OuterClass this0; public OuterClassInnerClass(OuterClass); Code: 0: aload_0 1: aload_1 2: putfield #10; //Field this$0:LOuterClass; 5: aload_0 6: invokespecial #12; //Method java/lang/Object.'<init>':()V 9: return

繼續失效

public class AnotherOuterClass { public static void main(String[] args) { InnerClass inner = new AnotherOuterClass().new InnerClass(); System.out.println('InnerClass Filed = ' + inner.x); } class InnerClass { private int x = 10; } }

和上面一樣,使用Javap反編譯一下

16:03 javap -c AnotherOuterClassInnerClassCompiled from 'AnotherOuterClass.java'class AnotherOuterClassInnerClass extends java.lang.Object{final AnotherOuterClass this0; AnotherOuterClassInnerClass(AnotherOuterClass); Code: 0: aload_0 1: aload_1 2: putfield #12; //Field this0:LAnotherOuterClass; 5: aload_0 6: invokespecial #14; //Method java/lang/Object.'<init>':()V 9: aload_0 10: bipush 10 12: putfield #17; //Field x:I 15: return static int access0(AnotherOuterClassInnerClass); Code: 0: aload_0 1: getfield #17; //Field x:I 4: ireturn }

編譯器自動生成了一個access$0一次來獲取x的值AnotherOuterClass.class的反編譯結果

16:08 javap -c AnotherOuterClassCompiled from 'AnotherOuterClass.java'public class AnotherOuterClass extends java.lang.Object{public AnotherOuterClass(); Code: 0: aload_0 1: invokespecial #8; //Method java/lang/Object.'<init>':()V 4: return public static void main(java.lang.String[]); Code: 0: new #16; //class AnotherOuterClassInnerClass 3: dup 4: new #1; //class AnotherOuterClass 7: dup 8: invokespecial #18; //Method '<init>':()V 11: dup 12: invokevirtual #19; //Method java/lang/Object.getClass:()Ljava/lang/Class; 15: pop 16: invokespecial #23; //Method AnotherOuterClassInnerClass.'<init>':(LAnotherOuterClass;)V 19: astore_1 20: getstatic #26; //Field java/lang/System.out:Ljava/io/PrintStream; 23: new #32; //class java/lang/StringBuilder 26: dup 27: ldc #34; //String InnerClass Filed = 29: invokespecial #36; //Method java/lang/StringBuilder.'<init>':(Ljava/lang/String;)V 32: aload_1 33: invokestatic #39; //Method AnotherOuterClassInnerClass.access0:(LAnotherOuterClassInnerClass;)I 36: invokevirtual #43; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder; 39: invokevirtual #47; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 42: invokevirtual #51; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 45: return }

其中這句話,直接說明通過內部類的實例,獲取到私有屬性x的操作。

invokestatic #39; //Method AnotherOuterClassInnerClass.access0:(LAnotherOuterClass$InnerClass;)I

在官網文檔中是這樣說道的,如果(內部類的)成員和構造方法設定成了私有修飾符,當且僅當其外部類訪問時是允許的。

如何保證不被訪問

使用的方法相當簡單,使用匿名內部類的方法實現

public class PrivateToOuter { Runnable mRunnable = new Runnable(){ private int x=10; @Override public void run() { System.out.println(x); } }; public static void main(String[] args){ PrivateToOuter p = new PrivateToOuter(); //System.out.println('anonymous class private filed= '+ p.mRunnable.x); //not allowed p.mRunnable.run(); // allowed }}

以上就是Java private修飾符失效的原因的詳細內容,更多關于Java private修飾符失效的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产精品国产三级国产有无不卡 | 丁香一区二区三区| 一个色综合av| 91麻豆免费看片| 一区二区三区四区五区精品| 欧美jizzhd精品欧美巨大免费| 牛牛国产精品| 丝袜亚洲另类丝袜在线| 秋霞影院一区二区| 成人午夜精品一区二区三区| 伊伊综合在线| 欧美性猛交一区二区三区精品| 欧美videos大乳护士334| 亚洲色图丝袜美腿| 日本伊人色综合网| 91麻豆精品一区二区三区| 欧美成人精品福利| 国产成人精品1024| 中文精品视频一区二区在线观看| 国产精品白丝在线| 黄色成人91| 欧美视频一二三区| 日韩高清欧美激情| 国产日韩欧美一区二区三区四区| 7777精品伊人久久久大香线蕉超级流畅 | 3d成人h动漫网站入口| 久久成人精品无人区| 欧美日韩亚洲一区| 91福利国产成人精品照片| 26uuu国产日韩综合| 午夜精品久久一牛影视| 99国产精品久久久久| 色婷婷国产精品综合在线观看| 国产精品欧美一级免费| 激情另类小说区图片区视频区| 国内精品美女在线观看| 日韩欧美中文字幕一区| 日韩精品高清不卡| 欧洲视频一区二区| 伊人色综合久久天天| 99久久99久久综合| 欧美国产欧美亚州国产日韩mv天天看完整 | 久久日韩粉嫩一区二区三区| 日本中文字幕一区二区视频| 欧美影视一区二区三区| 国产成人精品一区二区三区四区| 久久综合九色综合久久久精品综合| 午夜激情一区| 欧美大片一区二区三区| 美女在线一区二区| 国产精品日本| 蜜桃视频在线一区| 欧美一区二区三区日韩| 日本中文字幕一区| 欧美精品第1页| 亚洲图片欧美色图| 影音先锋中文字幕一区| 午夜精品福利在线| 欧美久久久久久久久久| 成人av电影观看| 欧美日韩一区在线| 视频在线观看一区二区三区| 欧美色网一区二区| 99久久久国产精品| 亚洲激情中文1区| 久久久久久久波多野高潮日日| 欧美国产一区在线| 国产日韩一区二区三区在线播放| 午夜不卡av在线| 欧美情侣在线播放| 免费观看在线综合色| 日韩一区二区在线看| 91色.com| 亚洲一区二区av电影| 亚洲第一黄网| 美日韩一区二区| 26uuu亚洲| 亚洲无线一线二线三线区别av| 亚洲一区二区免费视频| 欧美精品乱人伦久久久久久| 欧美午夜久久| 日韩vs国产vs欧美| 久久只精品国产| 亚洲深夜影院| 久久国产人妖系列| 久久精品亚洲精品国产欧美 | 欧美一区二区三区四区高清 | 91麻豆精品久久久久蜜臀| 午夜日韩视频| 六月丁香综合在线视频| 国产精品私人影院| 欧美中文字幕一区二区三区| 99在线视频精品| 日韩免费视频一区二区| 亚洲大黄网站| 奇米色777欧美一区二区| 久久综合久久综合久久综合| 亚洲在线国产日韩欧美| 婷婷久久综合九色综合绿巨人| 欧美日韩国产首页| 国内揄拍国内精品久久| 日日夜夜免费精品| 国产日本欧美一区二区| 不卡一区二区三区四区| 亚洲激情一二三区| 欧美一区二区三级| 免费中文字幕日韩欧美| 亚洲国产一区二区在线播放| 欧美zozozo| 国产精品久久久久久久久婷婷| 国产露脸91国语对白| 欧美电影在线免费观看| aa亚洲婷婷| 亚洲一区二区三区小说| 欧美成人伊人久久综合网| 国产日韩亚洲| 99视频精品免费视频| 亚洲高清视频中文字幕| 精品成a人在线观看| 99久久婷婷国产| 日本美女一区二区三区| 国产欧美视频在线观看| 欧美剧情电影在线观看完整版免费励志电影 | 欧美激情中文字幕| 久久字幕精品一区| 黄色av一区| 精品一区二区三区在线播放 | av成人激情| 国产91精品一区二区麻豆亚洲| 亚洲不卡一区二区三区| 91福利资源站| 激情久久久久久久| 高清国产一区二区| 日韩精品成人一区二区三区| 日本一区二区视频在线| 日韩三级视频在线观看| 欧美亚洲三区| 亚洲黄色一区二区三区| 午夜精彩视频在线观看不卡| 中文一区二区完整视频在线观看| 欧美日韩美女一区二区| 亚久久调教视频| 午夜精彩国产免费不卡不顿大片| 国产精品一区二区视频| 国产精品卡一卡二卡三| 欧美二区在线观看| 在线看一区二区| 亚洲人成免费| 国产一区二区中文| 丁香网亚洲国际| 经典三级一区二区| 亚洲一级二级三级在线免费观看| 国产精品欧美极品| 精品国产制服丝袜高跟| 91精品视频网| 在线观看亚洲a| 久久久久国产精品一区三寸 | 欧美亚洲综合久久| av不卡在线看| 亚洲精品在线二区| 国产精品国码视频| 91一区二区在线| 成人黄页在线观看| 精品一区精品二区高清| 日本不卡不码高清免费观看| 亚洲特黄一级片| 国产精品福利在线播放| 亚洲精品在线观| 欧美变态tickle挠乳网站| 欧美亚洲另类激情小说| 香蕉精品999视频一区二区| 欧美久久久久久久| 91视频国产资源| 国产乱码精品一区二区三| 国产自产高清不卡| 精彩视频一区二区| 国产一区二区女| 久久久久综合网| 欧美一区二区在线播放| 欧美日韩不卡一区二区| 欧美三区在线观看| 在线观看网站黄不卡| 欧洲国产伦久久久久久久| 欧美图片一区二区三区| 91成人在线观看喷潮| 欧美吞精做爰啪啪高潮| 色婷婷国产精品久久包臀 | www.综合网.com| 成人18精品视频| 97精品国产露脸对白| 成人aa视频在线观看| 91在线视频网址| 色综合天天视频在线观看| 亚洲成人精品一区| 亚洲永久精品国产| 午夜精品福利视频网站| 日韩精品电影在线| 蜜芽一区二区三区| 日韩精品久久理论片| 毛片av一区二区|