2010-11-15 59 views
16

我在Eclipse中嘗試編譯一些Java代碼時遇到了一些問題。我不斷收到以下警告...爲什麼OperatingSystemMxBean的訪問僅限於jre6/lib/rt.jar?

Access restriction: The type OperatingSystemMXBean is not accessible due to restriction on required library C:\Program Files\Java\jre6\lib\rt.jar 

從該行代碼...

com.sun.management.OperatingSystemMXBean bean = (com.sun.management.OperatingSystemMXBean) java.lang.management.ManagementFactory.getOperatingSystemMXBean(); 

我已經找到解決這個辦法,但我擔心限制的警告。此代碼適用於我的開源項目(CfTracker),如果我要打破某種許可協議,我不想解決此限制。任何人都可以幫我理解這個嗎?

回答

13

這不是許可協議的問題。只是Eclipse試圖保護您不使用不屬於官方JDK API的類(而是Oracle/Sun的JVM實現的一部分)。

是否有一個特殊的原因,你需要上課(而不是使用the "official" interface java.lang.management.OperatingSystemMXBean)?

如果您希望在預期的MXBean不可用時確保應用程序繼續運行,您可以添加一些try/catch邏輯以優雅地處理ClassCastException。

+0

由於蒂洛。這爲我清除它。我正在使用它來獲取Oracle/Sun實現中的getProcessCpuTime()方法。我是Java的新手,所以不知道它不是官方的API。我會嘗試使用try catch,因爲如果它不會一直在那裏,那麼它會很有意義:)乾杯! – 2010-11-15 12:18:08

+0

我認爲最好在項目設置級別重寫此選項。 – user626528 2015-03-24 06:56:45

13

轉到窗口 - >首選項 - > Java - >編譯器 - >錯誤/警告。 選擇棄用和受限制的API。將其更改爲警告。 更改禁止和勸阻引用並將其更改爲警告。 (或根據您的需要)。

謝謝。

9

最好的解決方案,我發現這個人是:

  • 進入到構建路徑設置在項目屬性。

  • 刪除JRE系統庫

  • 添加回;選擇「添加庫」並選擇JRE系統庫。

https://stackoverflow.com/a/2174607/1572446

+0

我只是偶然發現這個試圖解決我的問題,這工作。超級簡單,無雜亂的特殊情況配置。謝謝! – RNGuy 2015-11-04 14:05:36

1

這裏解釋Why Developers Should Not Write Programs That Call 'sun' Packages

OrientDB使用的解決方法是反射。

作爲一個例子:

try { 
    OperatingSystemMXBean os = ManagementFactory.getOperatingSystemMXBean(); 
    if (Class.forName("com.sun.management.OperatingSystemMXBean").isInstance(os)) { 
     Method memorySize = os.getClass().getDeclaredMethod("getTotalPhysicalMemorySize"); 
     memorySize.setAccessible(true); 
     return (Long) memorySize.invoke(os); 
    } 
} catch (Exception e) { 
} 
相關問題