1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package io.netty.channel.socket.nio;
17
18 import io.netty.channel.socket.InternetProtocolFamily;
19 import io.netty.util.internal.PlatformDependent;
20 import io.netty.util.internal.SuppressJava6Requirement;
21 import io.netty.util.internal.logging.InternalLogger;
22 import io.netty.util.internal.logging.InternalLoggerFactory;
23
24 import java.io.IOException;
25 import java.lang.reflect.InvocationTargetException;
26 import java.lang.reflect.Method;
27 import java.nio.channels.Channel;
28 import java.nio.channels.SocketChannel;
29 import java.nio.channels.spi.SelectorProvider;
30
31 final class SelectorProviderUtil {
32 private static final InternalLogger logger = InternalLoggerFactory.getInstance(SelectorProviderUtil.class);
33
34 @SuppressJava6Requirement(reason = "Usage guarded by java version check")
35 static Method findOpenMethod(String methodName) {
36 if (PlatformDependent.javaVersion() >= 15) {
37 try {
38 return SelectorProvider.class.getMethod(methodName, java.net.ProtocolFamily.class);
39 } catch (Throwable e) {
40 logger.debug("SelectorProvider.{}(ProtocolFamily) not available, will use default", methodName, e);
41 }
42 }
43 return null;
44 }
45
46 @SuppressJava6Requirement(reason = "Usage guarded by java version check")
47 static <C extends Channel> C newChannel(Method method, SelectorProvider provider,
48 InternetProtocolFamily family) throws IOException {
49
50
51
52
53
54
55 if (family != null && method != null) {
56 try {
57 @SuppressWarnings("unchecked")
58 C channel = (C) method.invoke(
59 provider, ProtocolFamilyConverter.convert(family));
60 return channel;
61 } catch (InvocationTargetException e) {
62 throw new IOException(e);
63 } catch (IllegalAccessException e) {
64 throw new IOException(e);
65 }
66 }
67 return null;
68 }
69
70 private SelectorProviderUtil() { }
71 }