Netty入门学习(五):Netty通过反射方式获取NioServerSocketChannel对象过程代码

背景
  1. 在服务端使用Netty的一个标准做法:
 EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workGroup = new NioEventLoopGroup();

        try{
            ServerBootstrap serverBootstrap = new ServerBootstrap();
            serverBootstrap.group(bossGroup, workGroup).channel(NioServerSocketChannel.class)
                    .handler(new LoggingHandler(LogLevel.WARN))
                    .childHandler(new MyServerInitalizer());
            ChannelFuture channelFuture = serverBootstrap.bind(8899).sync();
            channelFuture.channel().closeFuture().sync();
        } finally {
            bossGroup.shutdownGracefully();
            workGroup.shutdownGracefully();
        }
  1. Netty使用抽象类AbstractBootstrap的方法channel(NioServerSocketChannel.class)是怎么获取到NioServerSocketChannel实例的?

核心类体系结构
  1. 把Netty源码关于如何获取NioServerSocketChannel的实例的核心类拆解出来,结构图如下:
    在这里插入图片描述
  2. Channel代码
public interface Channel { }
  1. ChannelFactory代码
public interface ChannelFactory<T extends Channel>{

    T newChannel();
}
  1. ReflectiveChannelFactory代码
public class ReflectiveChannelFactory<T extends Channel> implements ChannelFactory<T> {

    private final Class<? extends T> clazz;

    public ReflectiveChannelFactory(Class<? extends T> clazz) {
        if (clazz == null) {
            throw new NullPointerException("clazz");
        }
        this.clazz = clazz;
    }

    @Override
    public T newChannel() {
        try {
            return clazz.getConstructor().newInstance();
        } catch (Throwable t) {
            throw new ChannelException("Unable to create Channel from class " + clazz, t);
        }
    }

    @Override
    public String toString() {
        return StringUtil.simpleClassName(clazz) + ".class";
    }

}
  1. AbstractBootstrap代码
public abstract class AbstractBootstrap<B extends AbstractBootstrap<B, C>, C extends Channel> {

    public volatile ChannelFactory<? extends C> channelFactory;


    public B channel(Class<? extends C> channelClass) {
        if (channelClass == null) {
            throw new NullPointerException("channelClass");
        }
        return channelFactory(new ReflectiveChannelFactory<C>(channelClass));
    }

    public B channelFactory(ChannelFactory<? extends C> channelFactory) {
        if (channelFactory == null) {
            throw new NullPointerException("channelFactory");
        }
        if (this.channelFactory != null) {
            throw new IllegalStateException("channelFactory set already");
        }

        this.channelFactory = channelFactory;
        return (B) this;
    }


}

  1. ServerBootstrap代码
public class ServerBootstrap extends AbstractBootstrap<ServerBootstrap, ServerChannel> {
    
}
  1. ServerScoketChannel代码
public interface ServerSocketChannel extends ServerChannel { }
  1. ServerChannel代码
public interface ServerChannel extends Channel { }
  1. NioServerSocketChannel代码
public class NioServerSocketChannel implements ServerSocketChannel { }

测试
  1. 测试代码
public class ReflectionTest {

    public static void main(String[] args) {
        ServerBootstrap serverBootstrap = new ServerBootstrap();

        ChannelFactory beforeChannelFactory = serverBootstrap.channelFactory;
        // null
        System.out.println(beforeChannelFactory);

        serverBootstrap.channel(NioServerSocketChannel.class);
        ChannelFactory afterChannelFactory = serverBootstrap.channelFactory;

        // NioServerSocketChannel.class
        System.out.println(afterChannelFactory);

        // com.slabs.netty.reflect.NioServerSocketChannel@4c873330
        ServerChannel serverChannel = serverBootstrap.channelFactory.newChannel();

        System.out.println(serverChannel);

    }
}

  1. 测试结果
    在这里插入图片描述

  2. 反射 + 泛型 + 工厂方法设计模式 实现把NioServerSocketChannel.class类型赋值给抽象类AbstractBootstrap的属性channelFactory

  3. 关键代码:channelFactory(new ReflectiveChannelFactory(channelClass))

  4. 通过channelFactory.newChannel()的方法就可以拿到:NioServerSocketChannel实例对象。

  5. 通过这个反射获取NioServerSocketChannel实例的小demo,熟悉Netty的核心架构体系。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值