接口实现类查看p126'n'
方案 1:IDEA 快捷键一键展开所有实现子类(最省事)
- 光标定位到类名
AbstractNioByteChannel; - Windows:
Ctrl + Alt + BMac:Command + Option + B弹窗会列出它全部直接子类,一眼就能看到:NioSocketChannel、NioServerSocketChannel、Epoll 系列等。
方案 2:调试模式下,查看当前运行对象真实 Class(你现在 Debug 栈直接用)
你现在停在这一行: AbstractNioByteChannel$NioByteUnsafe.read()
- 在当前方法里,找到所属的 channel 对象(
AbstractNioByteChannel实例); - 在 IDEA 的 Variables 变量面板里找到这个 channel;
- 点开变量左侧小箭头展开,里面有个
class属性,会直接显示:class io.netty.channel.nio.NioSocketChannel
找不到 channel 变量的简易办法
在 Debug 控制台 (Evaluate Expression) 输入:
this.channel().getClass()
执行,直接打印运行时真实的具体实现类。
方案 3:顺着源码看 newUnsafe(),锁定是谁创建了这个 NioByteUnsafe
AbstractNioByteChannel 中有抽象方法:
protected abstract NioByteUnsafe newUnsafe();
NioByteUnsafe 是依附外部 Channel 实例创建的,哪个子类重写了这个方法 new 出 Unsafe,哪个就是真正实现类:
- 点开这个抽象方法;
- IDEA 侧边栏的「实现标记」,跳转进去,就能看到
NioSocketChannel重写该方法,实例化NioByteUnsafe。 这就证明当前栈里的 Unsafe 所属 Channel 就是NioSocketChannel。
方案 4:顺着调用栈向上追溯
选中栈里这一行: read:163, AbstractNioByteChannel$NioByteUnsafe 右键 → Jump to Source,进入这个 read 方法; 方法内部一定持有外部类引用 AbstractNioByteChannel this$0, 在 Variables 里点开 this$0,它就是外层 Channel 实例,看它的 Class 即可。
Debug 看不到?
- 只点开了
NioByteUnsafe,没点开它持有的外部 Channel 引用; - Variables 面板默认折叠了外层宿主对象;
- 只盯着抽象类本身,抽象类本身没有实例,运行时全是它的子类对象。
对应你这条调用栈最终结论
当前 IO 读事件这条链路,百分之百是 NioSocketChannel ,这是 Netty NIO 模式下 TCP 连接唯一对应的AbstractNioByteChannel标准实现类。