使用反射的方法洽洁,創(chuàng)建一個非靜態(tài)內部類的實例

定義一個包含非靜態(tài)內部類的類

public class Outer {

  //內部類
   public class Inner{
      private String name = "默認值";
      public Inner(){
      }

      public Inner(String name){
         this.name = name;
      }

      public String getName() {
         return name;
      }

      public void setName(String name) {
         this.name = name;
      }

      @Override
      public String toString(){
         return "Inner 對象:"+this.name;
      }
   }
}

利用反射的方法獲取內部類的實例

import java.lang.reflect.Constructor;

public class Test {

   public static void main(String[] args) throws Exception {
      System.out.println(new Outer().new Inner());

      //使用反射的方法創(chuàng)建
      Class cls = Outer.Inner.class;

      Constructor constructor1 = cls.getDeclaredConstructor(Outer.class);
      Constructor constructor2 = cls.getDeclaredConstructor(Outer.class, String.class);

      Outer.Inner in1 = (Outer.Inner) constructor1.newInstance(new Outer());
      Outer.Inner in2 = (Outer.Inner) constructor2.newInstance(new Outer(), "測試");


      System.out.println(in1);
      System.out.println(in2);
   }
}

在用反射創(chuàng)建內部的實例時痘系,為什么會傳入了Outer類的實例,我們明明在內部類中饿自,定義了下面兩個構造器疤洹?

public Inner(){
}

public Inner(String name){
   this.name = name;
}

使用javap工具分析Inner類

javap -c Outer$Inner.class 命令得到如下文件

Compiled from "Outer.java"
public class com.nanc.Outer$Inner {
  final com.nanc.Outer this$0;

  public com.nanc.Outer$Inner(com.nanc.Outer);
    Code:
       0: aload_0
       1: aload_1
       2: putfield      #1                  // Field this$0:Lcom/nanc/Outer;
       5: aload_0
       6: invokespecial #2                  // Method java/lang/Object."<init>":()V
       9: aload_0
      10: ldc           #3                  // String 默認值
      12: putfield      #4                  // Field name:Ljava/lang/String;
      15: return

  public com.nanc.Outer$Inner(com.nanc.Outer, java.lang.String);
    Code:
       0: aload_0
       1: aload_1
       2: putfield      #1                  // Field this$0:Lcom/nanc/Outer;
       5: aload_0
       6: invokespecial #2                  // Method java/lang/Object."<init>":()V
       9: aload_0
      10: ldc           #3                  // String 默認值
      12: putfield      #4                  // Field name:Ljava/lang/String;
      15: aload_0
      16: aload_2
      17: putfield      #4                  // Field name:Ljava/lang/String;
      20: return

  public java.lang.String getName();
    Code:
       0: aload_0
       1: getfield      #4                  // Field name:Ljava/lang/String;
       4: areturn

  public void setName(java.lang.String);
    Code:
       0: aload_0
       1: aload_1
       2: putfield      #4                  // Field name:Ljava/lang/String;
       5: return

  public java.lang.String toString();
    Code:
       0: new           #5                  // class java/lang/StringBuilder
       3: dup
       4: invokespecial #6                  // Method java/lang/StringBuilder."<init>":()V
       7: ldc           #7                  // String Inner 對象:
       9: invokevirtual #8                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      12: aload_0
      13: getfield      #4                  // Field name:Ljava/lang/String;
      16: invokevirtual #8                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      19: invokevirtual #9                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      22: areturn
}

可以明顯看到昭雌,非靜態(tài)內部類Inner并沒有無參的構造器复唤,它的構造器需要一個Outer參數(shù)。

為什么會這樣烛卧?

系統(tǒng)在編譯階段總會為非靜態(tài)內部類的構造器增加一個參數(shù)佛纫,非靜態(tài)內部類的構造器的第一個參數(shù)總是外部類。因此調用非靜態(tài)內部類的構造器時必須傳入一個外部類對象作為參數(shù)总放,否則程序將會引發(fā)運行時異常呈宇。

非靜態(tài)內部類的規(guī)則

非靜態(tài)內部類必須寄生在外部類的實例中,沒有外部類的對象局雄,就不可能產生非靜態(tài)內部類的對象甥啄。因此非靜態(tài)內部類不可能有無參的的構造器---即使系統(tǒng)為非靜態(tài)內部類提供一個默認的構造器,這個默認的的構造器也需要一個外部類的形參哎榴。

如果要繼承一個非靜態(tài)內部類該怎么寫哩

public class Test extends Outer.Inner{

    /**
     * 為什么要這么寫型豁?
     * 因為Inner類沒有無參構造器
     * 使用 new Outer()作為主調----即以一個Out對象作為主調,
     * 其實這個主調會作為參數(shù)傳入super()尚蝌,也就是傳給Inner類的帶一個Out參數(shù)的構造器迎变。
     */
    public Test(){
        new Outer().super();
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市飘言,隨后出現(xiàn)的幾起案子衣形,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谆吴,死亡現(xiàn)場離奇詭異倒源,居然都是意外死亡,警方通過查閱死者的電腦和手機句狼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門笋熬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人腻菇,你說我怎么就攤上這事胳螟。” “怎么了筹吐?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵糖耸,是天一觀的道長。 經常有香客問我丘薛,道長嘉竟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任洋侨,我火速辦了婚禮舍扰,結果婚禮上,老公的妹妹穿的比我還像新娘凰兑。我一直安慰自己妥粟,他們只是感情好,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布吏够。 她就那樣靜靜地躺著勾给,像睡著了一般。 火紅的嫁衣襯著肌膚如雪锅知。 梳的紋絲不亂的頭發(fā)上播急,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音售睹,去河邊找鬼桩警。 笑死,一個胖子當著我的面吹牛昌妹,可吹牛的內容都是我干的捶枢。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼飞崖,長吁一口氣:“原來是場噩夢啊……” “哼烂叔!你這毒婦竟也來了?” 一聲冷哼從身側響起固歪,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤蒜鸡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逢防,經...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡叶沛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了忘朝。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灰署。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖辜伟,靈堂內的尸體忽然破棺而出氓侧,到底是詐尸還是另有隱情,我是刑警寧澤导狡,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站偎痛,受9級特大地震影響旱捧,放射性物質發(fā)生泄漏。R本人自食惡果不足惜踩麦,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一枚赡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谓谦,春花似錦贫橙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至才顿,卻和暖如春莫湘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背郑气。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工幅垮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人尾组。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓忙芒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親讳侨。 傳聞我的和親對象是個殘疾皇子呵萨,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內容

  • Java 內部類 分四種:成員內部類、局部內部類爷耀、靜態(tài)內部類和匿名內部類甘桑。 1、成員內部類: 即作為外部類的一個成...
    ikaroskun閱讀 1,231評論 0 13
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法跑杭,內部類的語法铆帽,繼承相關的語法,異常的語法德谅,線程的語...
    子非魚_t_閱讀 31,622評論 18 399
  • 靜態(tài)對象 靜態(tài)對象的數(shù)據(jù)是全局唯一的,一改全改利职。 引用方便掏颊。直接用 類名. 靜態(tài)方法名 或者 類名 . 靜態(tài)變量名...
    Yanci516閱讀 1,964評論 1 6
  • 世界好! 我是吳艾佳准浴,我現(xiàn)在還是個小不點事扭,像顆紅瓜子那么大,可是我很快就會長大乐横、健康的長大求橄! 爸爸媽媽很喜歡我,她...
    吳艾佳閱讀 252評論 0 0
  • 關于標題 恩,先吐槽下匾南,這個標題是在一本計算機著作中引用而來的啃匿。當然,引用的原因還就是他最為恰當蛆楞。 開發(fā)Garvi...
    文卿閱讀 467評論 0 1