日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

Java private修飾符失效的原因

瀏覽:192日期: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
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
麻豆成全视频免费观看在线看| jiujiure精品视频播放| 国产精品精品国产一区二区| 日本a口亚洲| 亚洲午夜国产成人| 麻豆亚洲精品| 日韩欧美一区二区三区在线观看| 久久久久午夜电影| 一区二区亚洲视频| 中文字幕一区日韩精品| 国产精品美女在线观看直播| 丝袜美腿诱惑一区二区三区| 日韩欧美在线中字| 不卡专区在线| 欧美国产亚洲精品| 麻豆国产精品一区二区三区| 麻豆久久久久久| 日韩在线第七页| 国产精品普通话对白| 亚洲aa在线| 麻豆精品少妇| 久久国产中文字幕| 日韩精品一区二区三区中文在线| 日韩综合一区二区三区| 91亚洲人成网污www| 欧美午夜不卡| 国产日韩欧美一区二区三区| 国产一区二区三区黄网站| 日韩在线成人| 国产一卡不卡| 自由日本语亚洲人高潮| 伊人成人网在线看| 日韩二区三区四区| 亚洲免费资源| 欧美日韩一区二区国产| 日本高清不卡一区二区三区视频| 99在线|亚洲一区二区| 精品视频在线一区二区在线| 欧美日韩国产一区精品一区| 天堂久久一区| 国产精品videosex极品| 亚洲天堂免费电影| 日韩高清一区在线| 美女少妇全过程你懂的久久| 亚洲麻豆一区| 香蕉精品999视频一区二区| 麻豆成人91精品二区三区| 视频一区视频二区中文字幕| 久久99久久久精品欧美| 日本亚洲最大的色成网站www| 久久国产电影| 美女毛片一区二区三区四区最新中文字幕亚洲 | 国产一级成人av| 国产亚洲精品久久久久婷婷瑜伽| 国产精品jk白丝蜜臀av小说| 亚洲专区视频| 免费看日韩精品| 欧美另类专区| 国产99久久久国产精品成人免费| 精品免费av| 精品三级av在线导航| 久久精品国产99国产| 国产精品一区二区美女视频免费看| 亚洲精品亚洲人成在线观看| 狠狠色狠狠色综合日日tαg| 亚洲午夜视频| 亚洲综合二区| 一区二区国产在线观看| 中文字幕成人| 99综合视频| 免费看黄色91| 日本欧美久久久久免费播放网| 日日摸夜夜添夜夜添国产精品| 天堂av一区| 嫩草伊人久久精品少妇av杨幂| 欧美91在线| 国产精品亚洲一区二区三区在线观看| 国产香蕉精品| 美女网站视频一区| 日本不卡视频一二三区| 欧美日韩a区| 激情五月综合网| 久久亚洲国产精品尤物| 视频一区二区三区在线| 亚洲网址在线观看| 成人一区而且| 日本色综合中文字幕| 亚洲网站视频| 久久国内精品| 亚洲福利一区| 老鸭窝一区二区久久精品| 蜜桃tv一区二区三区| 日本va欧美va欧美va精品| 日韩一区二区三区免费播放| 亚洲精品成人一区| 99精品电影| 久久精品福利| 日韩国产在线一| 99精品网站| 国产精品分类| 国产日韩一区| 久久精品xxxxx| 99在线观看免费视频精品观看| 国产欧美日韩一区二区三区四区| av亚洲一区二区三区| 欧美日韩一区二区三区不卡视频 | 香蕉成人av| 久久精品凹凸全集| 美女精品一区| 亚洲欧美日本日韩| 欧美日韩在线二区| 99久久99久久精品国产片果冰| 日韩精品电影| 欧美日韩精品一本二本三本| 久久99久久人婷婷精品综合| 亚洲精品伦理| 三级亚洲高清视频| 日韩国产一区| 麻豆视频一区| 国产精品一卡| 亚洲精品一二| 日本一区免费网站| 日本精品不卡| 国产a亚洲精品| 成人国产精品一区二区免费麻豆| 91麻豆精品激情在线观看最新| 综合干狼人综合首页| 国产欧美一区二区色老头| 久久精品国产久精国产爱| 中文在线а√天堂| 亚洲黄色免费看| 免费久久99精品国产| 欧美一区91| 久久中文精品| 偷拍欧美精品| 国产精品久久免费视频| 日韩免费福利视频| 日本午夜免费一区二区 | 蜜臀av国产精品久久久久| 日韩高清不卡一区二区| 成人午夜亚洲| 久久成人精品| 久久久久久久久久久妇女| 精品国产91| 日韩高清二区| 日韩黄色大片| 7777精品| 欧美日韩国产高清电影| 亚洲1区在线观看| 国产一区久久| 国产福利资源一区| 亚洲精品1区2区| 日韩欧美高清一区二区三区| 你懂的亚洲视频| 久久久精品区| 婷婷久久免费视频| 在线手机中文字幕| 国产麻豆一区二区三区精品视频| 久久久久久黄| 国产伦久视频在线观看| 欧美另类综合| 精品国产91| 国产综合视频| 国产视频久久| 国产不卡人人| 欧美精品99| 国产乱码精品一区二区三区亚洲人| 欧美日韩精品一区二区三区在线观看| 一区二区91| 色黄视频在线观看| 欧美精品观看| 久久久久99| 精品视频自拍| sm捆绑调教国产免费网站在线观看| 97人人精品| 免播放器亚洲| 国产欧美一区二区精品久久久 | 伊人久久婷婷| 亚洲深夜视频| 日本欧美大码aⅴ在线播放| 一区免费视频| 国产午夜精品一区二区三区欧美| 精品免费av| 国产成人久久精品麻豆二区| 国产一区二区三区四区五区| 国产高清亚洲| 国产区精品区| 久久亚洲黄色| 久久久免费人体| 国产精品免费大片| 91嫩草亚洲精品| 999精品一区| 亚洲综合另类| 日韩极品在线观看| 日韩动漫一区| 国产欧美91| 亚洲综合电影| 91精品丝袜国产高跟在线| 国产伦精品一区二区三区视频| 日韩在线观看不卡|