精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

談談如何在運行時獲取「環境」信息

開發 開發工具
軟件工程師,特別是開發客戶端產品,App這一類,都免不了需要判斷當前所處環境。比如客戶端產品要判斷是Windows/Linux系統,x86還是x64等等。 App則需要判斷安卓、iOS的版本,當前環境是否WIFI之類的。

軟件工程師,特別是開發客戶端產品,App這一類,都免不了需要判斷當前所處環境。比如客戶端產品要判斷是Windows/Linux系統,x86還是x64等等。 App則需要判斷安卓、iOS的版本,當前環境是否WIFI之類的。

[[233843]]

對于 Java 應用, 無論 Web 還是 桌面應用,也會遇到需要判斷當前所使用的 JDK 版本,當前應用對應的操作系統等等。

比如我們在幾年前做應用服務器集群管理與監控時,需要判斷應用服務器所屬物理機器的CPU以及內存的使用率、對于服務器實例進行操作,對于不同的JVM 實現,采用不同的attach機制等等。當時是使用 Sigar 進行這些硬件信息的獲取。

由于提供的是All in One 的版本,所以需要判斷操作系統類型,來判斷加載 Sigar 的Windows支持 dll 文件還是Linux 支持 so 文件。

當然獲取操作系統類型、版本都較容易,直接通過System 的getProperty再加上對應的名稱就能拿到,比如「os.name」,「os.arch」等。對于 JVM 的廠商,則可以通過「java.vm.vendor」來得到,完整的可以通過System.getProperties全部拿到。

如果習慣使用JMX 讀取Platform 的 MBean,也可以通過 JMX來獲取,便捷操作類似這樣:

  1. OperatingSystemMXBean os = ManagementFactory.getOperatingSystemMXBean(); 
  2. System.out.println(os.getName()); 

本質上也都是一樣的。

那除了這種方式,還有哪些方式可以獲取到呢?一般開源軟件又是怎么做的呢?

我們來看 Tomcat 內部怎么實現的。

我們發現, Tomcat 內部,對于通過 System 的 properties獲取到的,基本都是用來打印 Log 和輸出使用,對于應用內的控制,基本沒看到使用。

那 Tomcat在判斷版本時,是怎么做的呢?為什么不直接用這個呢?

首先看怎么做的。

前面的文章提到過, Tomcat 對于內存泄漏做了一些努力,比如先Hold 一塊內存這種(Tomcat與內存泄露處理),也比如防止內存泄漏的PreventionListener,會先將可能共用的 class加載到Common classLoader里。

那這里加載到 Common classLoader這些常用 class時,就需要判斷當前是Java 哪個版本,因為有些 class 是某些版之后才出現的。

具體實現是這個樣子:

  1. // Trigger a call to sun.awt.AppContext.getAppContext(). This 
  2. // will pin the system class loader in memory but that shouldn't 
  3. // be an issue. 
  4. if (appContextProtection && !JreCompat.isJre8Available()) { 
  5.     ImageIO.getCacheDirectory(); 
  6.  
  7. // Trigger the creation of the AWT (AWT-Windows, AWT-XAWT, 
  8. // etc.) thread 
  9. if (awtThreadProtection && !JreCompat.isJre9Available()) { 
  10.     java.awt.Toolkit.getDefaultToolkit(); 

什么時候 Available了?

  1. static { 
  2.     // This is Tomcat 8 with a minimum Java version of Java 7. The latest 
  3.     // Java version the optional features require is Java 9. 
  4.     // Look for the highest supported JVM first 
  5.     if (Jre9Compat.isSupported()) { 
  6.         instance = new Jre9Compat(); 
  7.         jre9Available = true
  8.         jre8Available = true
  9.     } 
  10.     else if (Jre8Compat.isSupported()) { 
  11.         instance = new Jre8Compat(); 
  12.         jre9Available = false
  13.         jre8Available = true
  14.     } else { 
  15.         instance = new JreCompat(); 
  16.         jre9Available = false
  17.         jre8Available = false
  18.     } 

具體是不是支持是直接通過加載特定版JDK 對應的 class 來判斷

  1. static { 
  2.     Method m1 = null
  3.     try { 
  4.         // The class is Java6+... 
  5.         Class<?> c1 = Class.forName("javax.net.ssl.SSLParameters"); 
  6.         // ...but this method is Java8+ 
  7.         m1 = c1.getMethod("setUseCipherSuitesOrder", boolean.class); 
  8.     } catch (SecurityException e) { 
  9.         // Should never happen 
  10.     } catch (NoSuchMethodException e) { 
  11.         // Expected on Java < 8 
  12.     } catch (ClassNotFoundException e) { 
  13.         // Should never happen 
  14.     } 
  15.     setUseCipherSuitesOrderMethod = m1

通過這種加載 class 的方式,和 我們前面通過 System.property獲取,有啥區別呢?

要知道, System 的 Property 是個系統屬性,是可配置的,也就是說,誰都可以進行setProperty的操作。如果不巧被別人改了,那你的程序可能就會出現不符合你預期的行為。

而加載類的形式,并不受其他人的影響。是最真實的一線聲音。

這樣的判斷不方式,不僅 Tomcat 自己,其他框架也有在用。我們來看 Spring Boot。

Boot 執行的時候,有時候會判斷當前應用是否需要支持 Web, 類似于是否加載了 Spring MVC 這種。

  1. private static final String[] WEB_ENVIRONMENT_CLASSES = { "javax.servlet.Servlet", 
  2.     "org.springframework.web.context.ConfigurableWebApplicationContext" }; 
  3.      
  4.         private boolean deduceWebEnvironment() { 
  5.             for (String className : WEB_ENVIRONMENT_CLASSES) { 
  6.                 if (!ClassUtils.isPresent(className, null)) { 
  7.                     return false; 
  8.                 } 
  9.             } 
  10.             return true; 
  11.         } 

然后在啟動時候,會調用deduceWebEnvironment 方法,從而決定一些執行的邏輯。

還有其他方式么? 如何不想自己手工處理,可以使用一些工具類,比如 Apache 的 commons-lang, 提供了一個 SystemUtils 可以直接。例如判斷操作系統和 Java 版本

  1. if (SystemUtils.IS_JAVA_1_7) { 
  2.     System.out.println("Hello 1.7"); 

工具類是怎么做的呢?

  1. public static final String JAVA_VERSION = getSystemProperty("java.version"); 
  2. private static String getJavaVersionTrimmed() { 
  3.     if(JAVA_VERSION != null) { 
  4.         for(int i = 0; i < JAVA_VERSION.length(); ++i) { 
  5.             char ch = JAVA_VERSION.charAt(i); 
  6.             if(ch >= 48 && ch <= 57) { 
  7.                 return JAVA_VERSION.substring(i); 
  8.             } 
  9.         } 
  10.     } 
  11.  
  12.     return null; 

說到底,也還是System.getProperty.

所以,在檢測環境的時候,我們可以通過System.getProperty,也可以通過 Tomcat 和 Spring 這種加載 class 的方式。或者干脆直接用工具類。 你還用過啥辦法呢?

【本文為51CTO專欄作者“侯樹成”的原創稿件,轉載請通過作者微信公眾號『Tomcat那些事兒』獲取授權】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2015-09-09 10:10:35

運行時改變圖標

2020-07-15 11:17:04

云計算云安全云原生

2015-07-20 15:44:46

Swift框架MJExtension反射

2021-08-18 08:32:09

代碼運行時間示波器

2023-04-03 13:01:14

UbuntuCRI-O

2024-03-21 09:15:58

JS運行的JavaScrip

2018-04-08 14:27:45

Linuxuptime系統運行時間

2020-04-06 11:47:44

Linux命令腳本

2022-10-08 00:00:00

V8channel對象

2009-06-17 15:46:36

Java運行時本機內存

2019-07-12 09:30:12

DashboardDockerDNS

2021-09-11 15:38:23

容器運行鏡像開放

2023-11-21 16:31:51

C++語言

2022-10-08 00:06:00

JS運行V8

2021-08-27 00:21:19

JSJust源碼

2023-08-29 08:20:35

Kubernete跨云容器

2023-02-12 12:00:57

2022-12-30 08:08:30

2014-09-02 10:39:53

Go語言C語言

2009-11-02 12:25:30

點贊
收藏

51CTO技術棧公眾號

视频一区二区视频| 国产精品国产福利国产秒拍| 免费观看一区二区三区| 成人在线黄色电影| 欧美激情一区二区三区四区| 91探花福利精品国产自产在线| 精品少妇theporn| 黄色不卡一区| 精品少妇一区二区三区在线视频| 成人免费xxxxx在线视频| 丝袜在线观看| 日本一区二区免费在线观看视频| 成人在线免费网站| 中文av免费观看| 亚洲毛片网站| 久久影院免费观看| 一道本在线观看| av成人综合| 欧美日韩免费一区二区三区 | 亚洲 美腿 欧美 偷拍| 麻豆精品新av中文字幕| 9.1国产丝袜在线观看 | 岛国视频免费在线观看| 岛国av在线一区| 91精品国产自产在线老师啪 | 日韩特级毛片| 国产精品视频yy9299一区| 国产精品香蕉视屏| 国产探花精品一区二区| 奇米四色…亚洲| 热99久久精品| 免费在线观看黄网站| 国产精品jizz在线观看美国| 在线看欧美日韩| 色婷婷在线影院| 久久免费视频66| 欧美成人一区二区三区| 国产精品久久久久久久av福利| 中文字幕色婷婷在线视频| 亚洲一区二区三区视频在线| 免费成人进口网站| 午夜视频成人| 中文字幕精品一区二区三区精品| 美国av一区二区三区| 人妻偷人精品一区二区三区| 国产成人在线免费观看| 亚洲一区二区在线| 国产精品久久久久久久免费看| 奇米一区二区三区| 国产精品久久久久久久av电影| 国产精品免费精品一区| 米奇777在线欧美播放| 欧美亚洲在线播放| 一二三区免费视频| 久久久成人网| 国产成人福利视频| 337p粉嫩色噜噜噜大肥臀| 亚洲女同同性videoxma| 欧美亚洲国产精品| 在线观看污污网站| 日本午夜一区二区| 国产在线观看精品| 国产精品久久久久久久一区二区| 国产一区二区不卡| 99九九电视剧免费观看| 亚洲精品久久久久久久久久| 成人激情文学综合网| 狠狠久久综合婷婷不卡| 亚洲欧美自偷自拍| 国产日产亚洲精品系列| 日韩资源av在线| 欧美激情午夜| 一区二区三区欧美在线观看| 成人精品视频在线播放| 免费日韩电影| 欧美日韩国产高清一区二区| aaaaaaaa毛片| 欧美xxxx在线| 国产一区二区三区在线看 | 六月丁香色婷婷| 91亚洲午夜精品久久久久久| 日韩欧美激情一区二区| 超碰在线最新| 午夜电影一区二区| 精品久久久久久久无码| 国产一区 二区| 亚洲精品动漫久久久久| 永久免费av无码网站性色av| 亚洲女同一区| 2018日韩中文字幕| 亚洲最大成人在线视频| 成人一区二区在线观看| 日本一区高清不卡| 色呦呦在线资源| 色94色欧美sute亚洲线路二| 91亚洲一区二区| 日韩大胆成人| 欧美xxxx做受欧美.88| 欧美一级特黄视频| 黄色精品一二区| 久久久久久国产精品免费免费| 亚洲乱亚洲乱妇| 午夜精品福利一区二区三区av | 久草热在线观看| 国产成人午夜精品影院观看视频 | 欧美96在线| 婷婷成人综合网| 亚洲第一色av| 精品国产精品| 久久久久久久久中文字幕| 91丨九色丨海角社区| 国产不卡在线视频| 午夜老司机精品| 三妻四妾完整版在线观看电视剧| 91麻豆精品国产自产在线| 国产免费一区二区三区网站免费| 国产一区亚洲| 国产日韩欧美中文| 黄色av免费在线观看| 亚洲国产人成综合网站| 亚洲一区二区图片| 欧美激情欧美| 国产精品99久久99久久久二8| 亚洲精品一级片| 亚洲欧美日韩一区二区三区在线观看 | 91久久夜色精品国产网站| 欧美黄色小说| 欧美丝袜第一区| a天堂视频在线观看| 你懂的国产精品| 91久久久久久久| 日本在线视频观看| 欧美午夜一区二区三区免费大片| 亚洲天堂网一区二区| 91久久亚洲| 国产精品swag| 欧美xxxx性xxxxx高清| 欧美一级片在线| 欧美性x x x| 久久国产三级精品| 亚洲人成网站在线观看播放| 视频精品导航| 在线观看国产精品日韩av| 国产黄色免费视频| 国产视频一区二区在线观看| 黄在线观看网站| 欧美日日夜夜| **欧美日韩vr在线| 色播色播色播色播色播在线| 午夜精品影院在线观看| 美女久久久久久久久| 国产欧美一区二区色老头| 国产视频一区二区不卡| 国产一二在线播放| 日韩电影第一页| 日韩手机在线视频| 国产女人18水真多18精品一级做| 日韩中文字幕组| japanese国产精品| 成人欧美一区二区三区黑人| 在线观看中文字幕的网站| 日韩欧美国产电影| 国产午夜视频在线播放| 91最新地址在线播放| 99久久久无码国产精品6| 国产一区二区三区四区五区传媒| 国产精品电影网站| 免费a级人成a大片在线观看| 91精品国产乱码| 久久久久久久久久久久久久久久久| 国产v日产∨综合v精品视频| 国产91在线免费| 欧美老女人另类| 91久久中文字幕| av老司机免费在线| 亚洲人成电影网站| 国产特黄一级片| 欧美日韩免费在线| 精品人体无码一区二区三区| 国产乱子轮精品视频| 鲁一鲁一鲁一鲁一色| 欧美一二区在线观看| 亚洲综合在线做性| 色黄视频在线观看| 精品国产自在精品国产浪潮| 免费观看黄色一级视频| 日本黄色一区二区| 欧美性猛交xxxxx少妇| 91麻豆产精品久久久久久| 色一情一区二区三区| 999在线观看精品免费不卡网站| 日韩一区不卡| 第一区第二区在线| 国产伦精品免费视频| 欧美aaaaaaa| 中文国产成人精品| 成人午夜福利视频| 欧美性生活影院| 国产成年人免费视频| 国产精品国产a级| 艳妇乳肉豪妇荡乳xxx| 久久精品国产99国产| 少妇人妻无码专区视频| 99久久.com| 欧美日韩一区在线观看视频| 日本免费精品| 成人免费视频97| 户外露出一区二区三区| 国产综合在线视频| av在线免费网站| 中文字幕视频一区二区在线有码 | 久久九九久久九九| 大尺度在线观看| 精品中文av资源站在线观看| 免费裸体美女网站| 99xxxx成人网| 成人短视频在线观看免费| 日韩欧美一区二区三区在线视频 | 欧美高清性xxxx| 国产剧情在线观看一区二区| 国产九九在线视频| 免费欧美在线| 免费无遮挡无码永久视频| 欧美aⅴ99久久黑人专区| 亚洲国产高清国产精品| 国产va免费精品观看精品视频| 国产日韩三区| 国产精伦一区二区三区| 91黄色国产视频| 欧美日韩中出| 亚洲一区精品电影| 国产精品日本一区二区不卡视频| 国产精品天天狠天天看| 123成人网| 国产精品久久二区| 日韩电影av| 国产精品91久久久久久| 欧美成人性网| 国产精品福利观看| 国产电影一区二区三区爱妃记| 国产精品高潮呻吟视频| 九色成人搞黄网站| 国产日韩欧美在线视频观看| 久久免费资源| 亚洲www永久成人夜色| 国产999精品在线观看| 成人精品在线观看| 9999精品| 成人18视频| 国产毛片精品| 国产精品欧美久久| 欧美亚洲色图校园春色| 欧美日韩亚洲一区二区三区在线观看 | 综合久久2023| 国产精品久久久久77777| 欧洲成人一区| 91天堂在线视频| 亚洲视频三区| 久久99欧美| 欧美猛男男男激情videos| 日韩一区二区电影在线观看| 欧美gayvideo| 欧美国产视频一区| 国产日韩1区| 99草草国产熟女视频在线| 麻豆精品一二三| 波多野结衣电影免费观看| 99精品一区二区三区| 亚洲最大成人网站| 国产精品久久久久久久第一福利| 五月婷婷一区二区| 岛国av一区二区在线在线观看| 潘金莲一级淫片aaaaaa播放| 欧美日韩久久一区二区| 亚洲不卡免费视频| 精品伊人久久97| 婷婷在线视频| 国内精品久久久久久久| 免费观看成人性生生活片 | 欧美男男freegayvideosroom| 日韩精品不卡| 欧美日本精品| 精品www久久久久奶水| 老司机午夜精品| 黄色国产在线视频| 中文字幕巨乱亚洲| 国产一级做a爱免费视频| 色成年激情久久综合| 亚洲AV无码国产精品午夜字幕| 亚洲欧美国产视频| 超碰电影在线播放| 欧美在线亚洲在线| 精品国产一区二区三区性色av| 精品一区二区视频| 亚洲最新av| 欧美成人黑人猛交| 国产91精品在线观看| 蜜乳av中文字幕| 亚洲在线免费播放| 中文字幕有码视频| 亚洲丁香久久久| 欧美日韩xx| 国产精品xxx视频| 999国产精品一区| 亚洲视频sss| 久久青草久久| 艳妇乳肉豪妇荡乳xxx| 亚洲色图19p| 自拍偷拍色综合| 日韩精品在线观看视频| 男女在线观看视频| 成人伊人精品色xxxx视频| 亚洲第一福利专区| 国产 日韩 欧美在线| 国产乱码精品一区二区三区忘忧草| 人妻一区二区视频| 午夜久久久久久久久| 精品国自产拍在线观看| 影音先锋欧美精品| 成人免费无遮挡| 精品国产一区二区三区免费| 国产一区视频在线观看免费| 精品综合久久久久| 国产精品久久久久精k8| 男人天堂视频网| 亚洲人成电影网站色xx| 午夜影视一区二区三区| 国产一区二区三区高清视频| 欧美激情1区2区| 91丨porny丨九色| 中文字幕字幕中文在线中不卡视频| 一区二区视频免费| 一区二区亚洲欧洲国产日韩| 自由日本语热亚洲人| 美女主播视频一区| 香蕉成人久久| 一级黄色片大全| 色婷婷综合久久久中文一区二区 | 久久天天做天天爱综合色| 日韩av电影网| 日韩久久午夜影院| 最新中文字幕在线播放| 久久久久久99| 石原莉奈一区二区三区在线观看| 欧美色图亚洲激情| 欧美性感美女h网站在线观看免费| 姝姝窝人体www聚色窝| 91国内在线视频| 亚洲电影一级片| 男人插女人下面免费视频| 久久久www免费人成精品| 一级黄色在线观看| 中文字幕欧美在线| 99久久999| 日韩一级免费看| 99久久精品免费精品国产| 日本一级一片免费视频| 亚洲精品国产精品国自产观看浪潮| 美女扒开腿让男人桶爽久久软| 久久久亚洲综合网站| 日日欢夜夜爽一区| 美国黄色片视频| 精品久久国产字幕高潮| 美女高潮在线观看| 色涩成人影视在线播放| 精品无码三级在线观看视频| 免费无码毛片一区二区app| 日韩av在线一区二区| 成人日韩精品| 黄色网络在线观看| 99视频有精品| 国产偷人爽久久久久久老妇app| 插插插亚洲综合网| 老司机成人在线| 嫩草影院国产精品| 一卡二卡三卡日韩欧美| 欧美新色视频| 成人免费在线视频网站| 亚洲激情视频| 麻豆视频免费在线播放| 精品日韩欧美一区二区| 日韩电影免费观| 国产小视频免费| 国产日韩三级在线| 午夜精品久久久久久久爽| 国产va免费精品高清在线观看| 久久伦理在线| 国产白嫩美女无套久久| 欧美午夜精品免费| 国产网红女主播精品视频| 日韩久久在线| 成人视屏免费看| 一区二区三区黄色片| 久久久中文字幕| 亚洲欧美日韩高清在线| 波多野结衣片子| 亚洲精品在线电影| 免费一级欧美在线观看视频| 国产超级av在线| 亚洲精品视频观看|