內部類訪問外部類的方法
阿新 • • 發佈:2020-12-02
作為一個工作了8年的程式設計師,內部類也用過,但是內部類訪問外部類在看原始碼的時候都很少看到了,震驚之餘也感嘆自己的技術不行啊
一 起因
突然想起來自己在中興的時候做SDN,當時是自己寫netty定時往網元傳送心跳。突然就想到了當時用的是Jdk的ScheduledThreadPoolExecutor
也是心血來潮就想著看看原始碼吧
實現定時的邏輯在ScheduledFutureTask.run()
public void run() { boolean periodic = isPeriodic(); if (!canRunInCurrentRunState(periodic)) cancel(false); else if (!periodic) ScheduledFutureTask.super.run(); else if (ScheduledFutureTask.super.runAndReset()) { setNextRunTime(); reExecutePeriodic(outerTask); } }
注意了,這個 方法reExecutePeriodic是定義在ScheduledThreadPoolExecutor
內部類的方法裡直接訪問外部類的方法??貌似我之前都沒有注意過。
void reExecutePeriodic(RunnableScheduledFuture<?> task) { if (canRunInCurrentRunState(true)) { super.getQueue().add(task); if (!canRunInCurrentRunState(true) && remove(task)) task.cancel(false); else ensurePrestart(); } }
二 驗證
利用工具我們就驗證下
程式碼如下 。在專案工程下產生兩個檔案Person.class,Person$InnerClass.class
public class Person { private class InnerClass { }
執行javap結果如下
能看到內部類中持有一個外部類型別的成員變數,這就說的通了可以直接訪問外部類的方法了