最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java private修飾符失效的原因

 更新時間:2020年10月23日 10:54:58   作者:melovemingming  
在Java編程里,使用private關(guān)鍵字修飾了一個成員,只有成員內(nèi)部可以訪問,其余成員都不可訪問,今天說明一下private功能失效的問題。

失效之Java內(nèi)部類

在一個內(nèi)部類里訪問外部類的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 OuterClass
Compiled 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
 
}

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

15:37 javap -c OuterClassInnerClass
Compiled 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
}

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

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

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

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

即,在內(nèi)部類構(gòu)造的時候,會有外部類的引用傳遞進(jìn)來,并且作為內(nèi)部類的一個屬性,所以內(nèi)部類會持有一個其外部類的應(yīng)用。
this$0就是內(nèi)部類持有的外部類引用,通過構(gòu)造方法傳遞引用并賦值。

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

繼續(xù)失效

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 AnotherOuterClassInnerClass
Compiled 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的反編譯結(jié)果

16:08 javap -c AnotherOuterClass
Compiled 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
 
}

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

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

在官網(wǎng)文檔中是這樣說道的,如果(內(nèi)部類的)成員和構(gòu)造方法設(shè)定成了私有修飾符,當(dāng)且僅當(dāng)其外部類訪問時是允許的。

如何保證不被訪問

使用的方法相當(dāng)簡單,使用匿名內(nèi)部類的方法實現(xiàn)

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修飾符失效的原因的詳細(xì)內(nèi)容,更多關(guān)于Java private修飾符失效的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 關(guān)于Lombok @Data注解:簡化Java代碼的魔法棒

    關(guān)于Lombok @Data注解:簡化Java代碼的魔法棒

    Lombok庫通過@Data注解自動生成常見的樣板代碼如getter、setter、toString等,極大減少代碼量,提高開發(fā)效率,@Data注解集成了@ToString、@EqualsAndHashCode、@Getter、@Setter、@RequiredArgsConstructor等注解的功能
    2024-10-10
  • springboot實現(xiàn)防盜鏈功能的示例代碼

    springboot實現(xiàn)防盜鏈功能的示例代碼

    防盜鏈(Hotlink Protection)是一種防止其他網(wǎng)站直接鏈接到你網(wǎng)站的資源,從而節(jié)省帶寬和保護(hù)內(nèi)容的有效手段,下面我們就來看看如何使用springboot實現(xiàn)防盜鏈功能吧
    2024-12-12
  • springboot下mybatis-plus如何打印sql日志和參數(shù)到日志文件

    springboot下mybatis-plus如何打印sql日志和參數(shù)到日志文件

    本文主要介紹了springboot下mybatis-plus如何打印sql日志和參數(shù)到日志文件,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Java中synchronized?的4個優(yōu)化技巧

    Java中synchronized?的4個優(yōu)化技巧

    本文主要介紹了Java中synchronized的4個優(yōu)化技巧,synchronized在JDK?1.5?時性能是比較低的,然而在后續(xù)的版本中經(jīng)過各種優(yōu)化迭代,它的性能也得到了前所未有的提升,下文更多相關(guān)資料需要的小伙伴可以參考一下
    2022-05-05
  • javaweb開發(fā)提高效率利器JRebel詳解

    javaweb開發(fā)提高效率利器JRebel詳解

    這篇文章主要介紹了javaweb開發(fā)提高效率利器JRebel詳解,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • SpringBoot?@Profile的使用

    SpringBoot?@Profile的使用

    本文主要介紹了SpringBoot?@Profile的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Java中的WeakHashMap簡析

    Java中的WeakHashMap簡析

    這篇文章主要介紹了Java中的WeakHashMap簡析,Map 的子類常見的有 HashMap、Hashtable、ConcurrentHashMap、LinkedHashMap 等,WeakHashMap,直譯就是,虛弱的 HashMap,從名字可得知其和 HashMap 有關(guān),需要的朋友可以參考下
    2023-09-09
  • java.io.IOException:?UT010029:?Stream?is?closed異常分析及解決

    java.io.IOException:?UT010029:?Stream?is?closed異常分析及解決

    這篇文章主要給大家介紹了關(guān)于java.io.IOException:?UT010029:?Stream?is?closed異常分析及解決辦法,文中通過代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-02-02
  • JAVA深入探究之Method的Invoke方法

    JAVA深入探究之Method的Invoke方法

    這篇文章主要給大家介紹了關(guān)于JAVA深入探究之Method的Invoke方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Spring和IDEA不推薦使用@Autowired?注解原因解析

    Spring和IDEA不推薦使用@Autowired?注解原因解析

    這篇文章主要為大家介紹了Spring和IDEA不推薦使用@Autowired?注解原因解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07

最新評論

富顺县| 张家口市| 屏东市| 平武县| 三原县| 探索| 修水县| 岚皋县| 平安县| 仪陇县| 澄城县| 湖口县| 若羌县| 武鸣县| 逊克县| 通渭县| 阿城市| 历史| 离岛区| 茂名市| 永丰县| 托克托县| 和静县| 武隆县| 孝感市| 邳州市| 琼结县| 城步| 灌阳县| 九江县| 广宗县| 漠河县| 藁城市| 沛县| 昂仁县| 兰考县| 邯郸市| 郯城县| 邵阳县| 神木县| 哈巴河县|