国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

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

開發 開發工具
軟件工程師,特別是開發客戶端產品,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

運行時改變圖標

2015-07-20 15:44:46

Swift框架MJExtension反射

2020-07-15 11:17:04

云計算云安全云原生

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對象

2021-09-11 15:38:23

容器運行鏡像開放

2019-07-12 09:30:12

DashboardDockerDNS

2009-06-17 15:46:36

Java運行時本機內存

2023-11-21 16:31:51

C++語言

2022-10-08 00:06:00

JS運行V8

2024-01-08 08:24:02

PythonSys 模塊工具

2020-12-07 13:31:43

GoMutex開發者

2013-11-26 16:49:55

Android開發運行時KitKat

2023-01-03 09:10:21

2023-07-28 10:42:43

2022-01-19 08:50:53

設備樹Linux文件系統
點贊
收藏

51CTO技術棧公眾號

国产精品av免费在线观看| 黑丝美女久久久| 久久综合福利| 五月天丁香久久| 精品国产亚洲一区二区三区在线 | 国产天堂在线| 亚洲男人天堂网| 欧美在线91| 成人满18在线观看网站免费| 亚洲加勒比久久88色综合| 欧美ab在线视频| qvod激情图片| 中文字幕欧美日韩精品| 亚洲青涩在线| 三级网站在线| 国产精品自拍小视频| 久久久久久久电影| 高潮在线视频| 视频一区二区视频| 亚洲视频在线免费看| 99re热这里只有精品免费视频| 麻豆一二三区精品蜜桃| 成人免费黄色网址| 91av在线不卡| 在线观看视频一区二区欧美日韩| 一本色道88久久加勒比精品| 欧美三级电影一区二区三区| 成人精品网站在线观看| 亚洲欧美在线磁力| 国产精品国产三级国产aⅴ入口| 精品免费av在线| 日韩人妻无码精品久久久不卡| 日韩精品一区二区三区三区免费 | 久久综合视频网| 一级毛片久久久| 国产又粗又猛又爽又黄的网站| 色婷婷激情综合| 国产精品密蕾丝视频下载| 国精产品一区二区三区有限公司| 18黄暴禁片在线观看| 伦伦影院午夜日韩欧美限制| 亚洲一区中文在线| 国内精品久久久久久久影视简单| 头脑特工队2在线播放| 亚洲激情图片| 久久久久久久久久久久久久久久久久av | 日韩精品视频免费在线观看| 麻豆精品国产传媒mv男同| 国产精品蜜芽在线观看| 国产一区二区在线网站| 日本免费一区二区三区视频观看| 日韩av中文字幕在线播放| 91美女视频网站| 精品国产一区探花在线观看 | 精品视频在线一区二区在线| 动漫成人在线| 热re99久久精品国产99热| 久久久久亚洲精品| 日韩欧美高清dvd碟片| 粉嫩av一区二区三区免费野| 国产成人a级片| japanese国产精品| 偷拍亚洲色图| 国产日韩中文在线中文字幕| 97cao在线| 欧美二区在线看| 精品爽片免费看久久| 国产精品每日更新| 日本中文一区二区三区| 日韩一区二区在线免费| 国产91在线播放精品| 激情在线小视频| 欧美69xxxx| 精品美女视频在线观看免费软件 | 91tv精品福利国产在线观看| 绿色成人影院| 午夜影院观看视频免费| 亚洲熟妇av一区二区三区漫画| 欧美极品色图| 国产美女扒开尿口久久久| 欧美人与性动交a欧美精品| 精品国产免费人成电影在线观看四季| 欧美日韩国产影片| 久久男人的天堂| 99re在线观看视频| 午夜精品亚洲一区二区三区嫩草| 国产精品果冻传媒潘| 九九99玖玖| 国产偷激情在线| 麻豆av在线免费看| 午夜成人影视| 成a人片在线观看| 精品嫩草影院| 2024国产精品| 激情视频亚洲| 男男gaygays亚洲| 青青青手机在线视频观看| 亚洲成熟丰满熟妇高潮xxxxx| 国产精品久久九九| 国产精品激情av电影在线观看| 久久综合九色九九| 亚洲欧美日韩另类| 日韩欧美黄色影院| 91久久精品一区二区三| 一卡二卡三卡日韩欧美| 国产欧美日韩另类一区| 欧美一级爽aaaaa大片| 成人免费淫片免费观看| 日本精品网站| 琪琪久久久久日韩精品| 麻豆成人精品| 国产清纯白嫩初高生在线观看91| 亚洲国产精品影院| 欧美成人黄色| 国产丝袜在线播放| 午夜伦全在线观看| 污污的网站在线观看| 美乳中文字幕| 人人干人人视频| 蜜桃传媒一区二区三区| 97av中文字幕| 五月天男人天堂| 亚洲亚洲精品三区日韩精品在线视频| 久久99蜜桃综合影院免费观看| 91精品黄色| 亚洲一区二区日本| 91精品视频在线播放| 国产精品视频久久| 国产精品视频免费在线观看| 国产精品xxxxx| 2018国产精品视频| 久久精品影视伊人网| 精品国内亚洲在观看18黄| 综合激情国产一区| 精品国产一区av| 精品国内亚洲在观看18黄| 日韩在线视频导航| 久久久91精品| 欧美精品一区二区免费| 欧美精品一区二区免费| 欧美精品成人在线| 欧美最顶级的aⅴ艳星| 国产精品69av| 成人免费在线视频网站| 懂色中文一区二区三区在线视频| 国产精品久久亚洲| 欧美一级爱爱| 超碰人人爱人人| 日韩av资源在线| eeuss鲁片一区| 两个人hd高清在线观看| 欧美日韩伦理片| 自拍视频在线| 国产白浆在线免费观看| 成人一区福利| 欧美国产亚洲精品| 欧美禁忌电影| 欧美特黄一区| 美女视频一区在线观看| 国产一区二区美女| 国产亚洲一区字幕| 亚洲自拍欧美精品| 欧美中文字幕不卡| 日韩欧美成人一区| 中文字幕在线视频日韩| 97免费在线视频| 亚洲一区二区少妇| 亚洲精品一区二区三| 99久久久无码国产精品6| 影音先锋可以看的网站| 成人在线免费公开观看视频| 成人影音在线| 日韩高清二区| 婷婷综合五月| 激情六月婷婷综合| 中文字幕第一区二区| 欧美日韩精品在线观看| 精品国产1区二区| 不卡中文字幕av| 成人夜晚看av| 丰满女人性猛交| 国产a级网站| a毛片在线观看| 色悠久久久久综合先锋影音下载| 91精品国产自产拍在线观看蜜| 蜜桃一区二区三区在线| 国产精品你懂的| 欧美精品在线观看播放| 一本色道久久88精品综合| 国产精品黄视频| 麻豆中文字幕在线观看| 国产一二三视频| 天堂av资源在线观看| 久久免费视频66| 久久久久综合| 中文字幕日韩一区| 精品国产免费视频| 国产精品高潮呻吟久久av野狼| 亚洲色图自拍| 香港三级经典全部种子下载|