private static BiFunction<Integer, ThreadFactory, ? extends EventLoopGroup> findEventLoopGroupConstructor(
            Class<? extends EventLoopGroup> eventLoopGroupType) throws Exception {
        requireNonNull(eventLoopGroupType, "eventLoopGroupType");
        final MethodHandle constructor =
                MethodHandles.lookup().unreflectConstructor(
                        eventLoopGroupType.getConstructor(int.class, ThreadFactory.class));

        return (nThreads, threadFactory) -> {
            try {
                return (EventLoopGroup) constructor.invoke(nThreads, threadFactory);
            } catch (Throwable t) {
                return Exceptions.throwUnsafely(Exceptions.peel(t));
            }
        };
    }
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