作为一个工作了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 中的,而ScheduledFutureTask是 定义在 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结果如下
能看到内部类中持有一个外部类类型的成员变量,这就说的通了可以直接访问外部类的方法了