private static TransportTypeProvider of(
            String name, @Nullable String channelPackageName, String entryPointTypeName,
            String serverSocketChannelTypeName, String socketChannelTypeName,
            @Nullable String domainServerSocketChannelTypeName, @Nullable String domainSocketChannelTypeName,
            String datagramChannelTypeName,
            String eventLoopGroupTypeName, String eventLoopTypeName) {

        if (channelPackageName == null) {
            return new TransportTypeProvider(
                    name, null, null, null, null, null, null, null, null,
                    new IllegalStateException("Failed to determine the shaded package name"));
        }

        // TODO(trustin): Do not try to load io_uring unless explicitly specified so JVM doesn't crash.
        //                https://github.com/netty/netty-incubator-transport-io_uring/issues/92
        if ("IO_URING".equals(name) && !"io_uring".equals(Ascii.toLowerCase(
                System.getProperty("com.linecorp.armeria.transportType", "")))) {
            return new TransportTypeProvider(
                    name, null, null, null, null, null, null, null, null,
                    new IllegalStateException("io_uring not enabled explicitly"));
        }

        try {
            // Make sure the native libraries were loaded.
            final Throwable unavailabilityCause = (Throwable)
                    findClass(channelPackageName, entryPointTypeName)
                            .getMethod("unavailabilityCause")
                            .invoke(null);

            if (unavailabilityCause != null) {
                throw unavailabilityCause;
            }

            // Load the required classes and constructors.
            final Class<? extends ServerSocketChannel> ssc =
                    findClass(channelPackageName, serverSocketChannelTypeName);
            final Class<? extends SocketChannel> sc =
                    findClass(channelPackageName, socketChannelTypeName);

            final Class<? extends ServerDomainSocketChannel> sdsc;
            if (domainServerSocketChannelTypeName != null) {
                sdsc = findClass(channelPackageName, domainServerSocketChannelTypeName);
            } else {
                sdsc = null;
            }

            final Class<? extends DomainSocketChannel> dsc;
            if (domainSocketChannelTypeName != null) {
                dsc = findClass(channelPackageName, domainSocketChannelTypeName);
            } else {
                dsc = null;
            }

            final Class<? extends DatagramChannel> dc =
                    findClass(channelPackageName, datagramChannelTypeName);

            final Class<? extends EventLoopGroup> elg =
                    findClass(channelPackageName, eventLoopGroupTypeName);
            final Class<? extends EventLoop> el =
                    findClass(channelPackageName, eventLoopTypeName);
            final BiFunction<Integer, ThreadFactory, ? extends EventLoopGroup> elgc =
                    findEventLoopGroupConstructor(elg);

            return new TransportTypeProvider(name, ssc, sc, sdsc, dsc, dc, elg, el, elgc, null);
        } catch (Throwable cause) {
            return new TransportTypeProvider(name, null, null, null, null, null, null, null, null,
                                             Exceptions.peel(cause));
        }
    }
Provides the properties required by {@link TransportType} by loading /dev/epoll and io_uring transport
classes dynamically, so that Armeria does not have hard dependencies on them.
See: <a href="https://github.com/line/armeria/issues/3243">line/armeria#3243</a>
core/src/main/java/com/linecorp/armeria/internal/common/util/TransportTypeProvider.java