微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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; Ig<a href="/tag/nor/" target="_blank" class="keywords">nor</a>e</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; Ig<a href="/tag/nor/" target="_blank" class="keywords">nor</a>e</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; Ig<a href="/tag/nor/" target="_blank" class="keywords">nor</a>e</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>"<a href="/tag/Could/" target="_blank" class="keywords">Could</a> not deter<a href="/tag/mine/" target="_blank" class="keywords">mine</a> 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; <a href="/tag/Failed/" target="_blank" class="keywords">Failed</a> 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; Ig<a href="/tag/nor/" target="_blank" class="keywords">nor</a>e.</span>

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

    logger.debug(</span>"UID: non-root (<a href="/tag/Failed/" target="_blank" class="keywords">Failed</a> 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",stemClassLoader()); Method m = vmClass.getDeclaredMethod("maxDirectMemory"= ((Number) m.invoke(nore </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; <a href="/tag/Now/" target="_blank" class="keywords">Now</a> 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>"<a href="/tag/javalang/" target="_blank" class="keywords">java.lang</a>.management.ManagementFactory",getSy<a href="/tag/stem/" target="_blank" class="keywords">stem</a>ClassLoader()); Class</span><?> runtimeClass =<span style="color: #000000;"&gt; Class.forName( </span>"<a href="/tag/javalang/" target="_blank" class="keywords">java.lang</a>.management.RuntimeMXBean",getSy<a href="/tag/stem/" target="_blank" class="keywords">stem</a>ClassLoader()); 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).ch<a href="/tag/ara/" target="_blank" class="keywords">ara</a>t(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; Ig<a href="/tag/nor/" target="_blank" class="keywords">nor</a>e</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>

等等

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐