netty检测系统工具PlatformDependent

1. 检测jdk版本

@SuppressWarnings("LoopStatementThatDoesntLoop" </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; Not really a loop</span> <span style="color: #0000ff;"&gt;for</span><span style="color: #000000;"&gt; (;;) { </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; Android</span> <span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt; (isAndroid()) { javaVersion </span>= 6<span style="color: #000000;"&gt;; </span><span style="color: #0000ff;"&gt;break</span><span style="color: #000000;"&gt;; } </span><span style="color: #0000ff;"&gt;try</span><span style="color: #000000;"&gt; { Class.forName(</span>"java.time.Clock",<span style="color: #0000ff;"&gt;false</span>,getClassLoader(Object.<span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt;)); javaVersion </span>= 8<span style="color: #000000;"&gt;; </span><span style="color: #0000ff;"&gt;break</span><span style="color: #000000;"&gt;; } </span><span style="color: #0000ff;"&gt;catch</span><span style="color: #000000;"&gt; (Exception e) { </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; Ignore</span>

<span style="color: #000000;"> }

        </span><span style="color: #0000ff;"&gt;try</span><span style="color: #000000;"&gt; {
            Class.forName(</span>"java.util.concurrent.LinkedTransferQueue",getClassLoader(BlockingQueue.<span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt;));
            javaVersion </span>= 7<span style="color: #000000;"&gt;;
            </span><span style="color: #0000ff;"&gt;break</span><span style="color: #000000;"&gt;;
        } </span><span style="color: #0000ff;"&gt;catch</span><span style="color: #000000;"&gt; (Exception e) {
            </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; Ignore</span>

<span style="color: #000000;"> }

        javaVersion </span>= 6<span style="color: #000000;"&gt;;
        </span><span style="color: #0000ff;"&gt;break</span><span style="color: #000000;"&gt;;
    }

    </span><span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt; (logger.isDebugEnabled()) {
        logger.debug(</span>"Java version: {}"<span style="color: #000000;"&gt;,javaVersion);
    }
    </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; javaVersion;
}</span></pre>

2. 检测是否window

windows = SystemPropertyUtil.get("os.name","").toLowerCase(Locale.US).contains("win""Platform: Windows"

3. 检测是否root权限

String[] ID_COMMANDS </span>= { "/usr/bin/id","/bin/id","/usr/xpg4/bin/id","id"<span style="color: #000000;"&gt;}; Pattern UID_PATTERN </span>= Pattern.compile("^(?:0|[1-9][0-9]*)$"<span style="color: #000000;"&gt;); </span><span style="color: #0000ff;"&gt;for</span><span style="color: #000000;"&gt; (String idCmd: ID_COMMANDS) { Process p </span>= <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;; BufferedReader in </span>= <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;; String uid </span>= <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;; </span><span style="color: #0000ff;"&gt;try</span><span style="color: #000000;"&gt; { p </span>= Runtime.getRuntime().exec(<span style="color: #0000ff;"&gt;new</span> String[] { idCmd,"-u"<span style="color: #000000;"&gt; }); in </span>= <span style="color: #0000ff;"&gt;new</span> BufferedReader(<span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; InputStreamReader(p.getInputStream(),CharsetUtil.US_ASCII)); uid </span>=<span style="color: #000000;"&gt; in.readLine(); in.close(); </span><span style="color: #0000ff;"&gt;for</span><span style="color: #000000;"&gt; (;;) { </span><span style="color: #0000ff;"&gt;try</span><span style="color: #000000;"&gt; { </span><span style="color: #0000ff;"&gt;int</span> exitCode =<span style="color: #000000;"&gt; p.waitFor(); </span><span style="color: #0000ff;"&gt;if</span> (exitCode != 0<span style="color: #000000;"&gt;) { uid </span>= <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;; } </span><span style="color: #0000ff;"&gt;break</span><span style="color: #000000;"&gt;; } </span><span style="color: #0000ff;"&gt;catch</span><span style="color: #000000;"&gt; (InterruptedException e) { </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; Ignore</span>

<span style="color: #000000;"> }
}
} <span style="color: #0000ff;">catch<span style="color: #000000;"> (Exception e) {
<span style="color: #008000;">//<span style="color: #008000;"> Failed to run the command.
uid = <span style="color: #0000ff;">null<span style="color: #000000;">;
} <span style="color: #0000ff;">finally<span style="color: #000000;"> {
<span style="color: #0000ff;">if (in != <span style="color: #0000ff;">null<span style="color: #000000;">) {
<span style="color: #0000ff;">try<span style="color: #000000;"> {
in.close();
} <span style="color: #0000ff;">catch<span style="color: #000000;"> (IOException e) {
<span style="color: #008000;">//<span style="color: #008000;"> Ignore
<span style="color: #000000;"> }
}
<span style="color: #0000ff;">if (p != <span style="color: #0000ff;">null<span style="color: #000000;">) {
<span style="color: #0000ff;">try<span style="color: #000000;"> {
p.destroy();
} <span style="color: #0000ff;">catch<span style="color: #000000;"> (Exception e) {
<span style="color: #008000;">//<span style="color: #008000;"> Android sometimes triggers an ErrnoException.
<span style="color: #000000;"> }
}
}

        </span><span style="color: #0000ff;"&gt;if</span> (uid != <span style="color: #0000ff;"&gt;null</span> &amp;&amp;<span style="color: #000000;"&gt; UID_PATTERN.matcher(uid).matches()) {
            logger.debug(</span>"UID: {}"<span style="color: #000000;"&gt;,uid);
            </span><span style="color: #0000ff;"&gt;return</span> "0"<span style="color: #000000;"&gt;.equals(uid);
        }
    }

    logger.debug(</span>"Could not determine the current UID using /usr/bin/id; attempting to bind at privileged ports."<span style="color: #000000;"&gt;);

    Pattern PERMISSION_DENIED </span>= Pattern.compile(".*(?:denied|not.*permitted).*"<span style="color: #000000;"&gt;);
    </span><span style="color: #0000ff;"&gt;for</span> (<span style="color: #0000ff;"&gt;int</span> i = 1023; i > 0; i --<span style="color: #000000;"&gt;) {
        ServerSocket ss </span>= <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;;
        </span><span style="color: #0000ff;"&gt;try</span><span style="color: #000000;"&gt; {
            ss </span>= <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; ServerSocket();
            ss.setReuseAddress(</span><span style="color: #0000ff;"&gt;true</span><span style="color: #000000;"&gt;);
            ss.bind(</span><span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; InetSocketAddress(i));
            </span><span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt; (logger.isDebugEnabled()) {
                logger.debug(</span>"UID: 0 (succeded to bind at port {})"<span style="color: #000000;"&gt;,i);
            }
            </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #0000ff;"&gt;true</span><span style="color: #000000;"&gt;;
        } </span><span style="color: #0000ff;"&gt;catch</span><span style="color: #000000;"&gt; (Exception e) {
            </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; Failed to bind.
            </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; Check the error message so that we don't always need to bind 1023 times.</span>
            String message =<span style="color: #000000;"&gt; e.getMessage();
            </span><span style="color: #0000ff;"&gt;if</span> (message == <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;) {
                message </span>= ""<span style="color: #000000;"&gt;;
            }
            message </span>=<span style="color: #000000;"&gt; message.toLowerCase();
            </span><span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt; (PERMISSION_DENIED.matcher(message).matches()) {
                </span><span style="color: #0000ff;"&gt;break</span><span style="color: #000000;"&gt;;
            }
        } </span><span style="color: #0000ff;"&gt;finally</span><span style="color: #000000;"&gt; {
            </span><span style="color: #0000ff;"&gt;if</span> (ss != <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;) {
                </span><span style="color: #0000ff;"&gt;try</span><span style="color: #000000;"&gt; {
                    ss.close();
                } </span><span style="color: #0000ff;"&gt;catch</span><span style="color: #000000;"&gt; (Exception e) {
                    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; Ignore.</span>

<span style="color: #000000;"> }
}
}
}

    logger.debug(</span>"UID: non-root (failed to bind at any privileged ports)"<span style="color: #000000;"&gt;);
    </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #0000ff;"&gt;false</span><span style="color: #000000;"&gt;;
}</span></pre>

4.检测最大直接内存

maxDirectMemory = 0 Class vmClass = Class.forName("sun.misc.VM",= vmClass.getDeclaredMethod("maxDirectMemory"= ((Number) m.invoke( </span><span style="color: #0000ff;"&gt;if</span> (maxDirectMemory > 0<span style="color: #000000;"&gt;) { </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; maxDirectMemory; } </span><span style="color: #0000ff;"&gt;try</span><span style="color: #000000;"&gt; { </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; Now try to get the JVM option (-XX:MaxDirectMemorySize) and parse it. </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; Note that we are using reflection because Android doesn't have these classes.</span> Class<?> mgmtFactoryClass =<span style="color: #000000;"&gt; Class.forName( </span>"java.lang.management.ManagementFactory",getSystemClassLoader()); Class</span><?> runtimeClass =<span style="color: #000000;"&gt; Class.forName( </span>"java.lang.management.RuntimeMXBean",getSystemClassLoader()); Object runtime </span>= mgmtFactoryClass.getDeclaredMethod("getRuntimeMXBean").invoke(<span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;); @SuppressWarnings(</span>"unchecked"<span style="color: #000000;"&gt;) List</span><String> vmArgs = (List<String>) runtimeClass.getDeclaredMethod("getInputArguments"<span style="color: #000000;"&gt;).invoke(runtime); </span><span style="color: #0000ff;"&gt;for</span> (<span style="color: #0000ff;"&gt;int</span> i = vmArgs.size() - 1; i >= 0; i --<span style="color: #000000;"&gt;) { Matcher m </span>=<span style="color: #000000;"&gt; MAX_DIRECT_MEMORY_SIZE_ARG_PATTERN.matcher(vmArgs.get(i)); </span><span style="color: #0000ff;"&gt;if</span> (!<span style="color: #000000;"&gt;m.matches()) { </span><span style="color: #0000ff;"&gt;continue</span><span style="color: #000000;"&gt;; } maxDirectMemory </span>= Long.parseLong(m.group(1<span style="color: #000000;"&gt;)); </span><span style="color: #0000ff;"&gt;switch</span> (m.group(2).charAt(0<span style="color: #000000;"&gt;)) { </span><span style="color: #0000ff;"&gt;case</span> 'k': <span style="color: #0000ff;"&gt;case</span> 'K'<span style="color: #000000;"&gt;: maxDirectMemory </span>*= 1024<span style="color: #000000;"&gt;; </span><span style="color: #0000ff;"&gt;break</span><span style="color: #000000;"&gt;; </span><span style="color: #0000ff;"&gt;case</span> 'm': <span style="color: #0000ff;"&gt;case</span> 'M'<span style="color: #000000;"&gt;: maxDirectMemory </span>*= 1024 * 1024<span style="color: #000000;"&gt;; </span><span style="color: #0000ff;"&gt;break</span><span style="color: #000000;"&gt;; </span><span style="color: #0000ff;"&gt;case</span> 'g': <span style="color: #0000ff;"&gt;case</span> 'G'<span style="color: #000000;"&gt;: maxDirectMemory </span>*= 1024 * 1024 * 1024<span style="color: #000000;"&gt;; </span><span style="color: #0000ff;"&gt;break</span><span style="color: #000000;"&gt;; } </span><span style="color: #0000ff;"&gt;break</span><span style="color: #000000;"&gt;; } } </span><span style="color: #0000ff;"&gt;catch</span><span style="color: #000000;"&gt; (Throwable t) { </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; Ignore</span>

<span style="color: #000000;"> }

    </span><span style="color: #0000ff;"&gt;if</span> (maxDirectMemory <= 0<span style="color: #000000;"&gt;) {
        maxDirectMemory </span>=<span style="color: #000000;"&gt; Runtime.getRuntime().maxMemory();
        logger.debug(</span>"maxDirectMemory: {} bytes (maybe)"<span style="color: #000000;"&gt;,maxDirectMemory);
    } </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt; {
        logger.debug(</span>"maxDirectMemory: {} bytes"<span style="color: #000000;"&gt;,maxDirectMemory);
    }

    </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; maxDirectMemory;
}</span></pre>

等等

相关文章

Netty实现httpserver简单示例 3个Java类实现最基本的接收请求...
Java NIO系列1 概观 Java NIO。中间的N你既可以理解为(new)...
关键字:使用Netty实现HTTP服务器,使用Netty实现httpserver...
netty心跳机制示例,使用Netty实现心跳机制,使用netty4,Id...
关键字:Netty开发redis客户端,Netty发送redis命令,netty解...
前提 最近一直在看Netty相关的内容,也在编写一个轻量级的RP...