为什么对于OperatingSystemMxBean,访问限制为jre6 / lib / rt.jar?

我正在尝试在Eclipse中编译的一些Java代码遇到一些麻烦。 我一直收到以下警告……

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 ),如果我打算违反某种许可协议,我不想解决这个限制。 任何人都可以帮我理解这个吗?

这不是许可协议的问题。 只是Eclipse试图保护您不使用不属于官方JDK API的类(而是Oracle / Sun的JVM实现的一部分)。

是否有特殊原因需要进行类转换(而不是使用“官方”接口java.lang.management.OperatingSystemMXBean )?

如果要确保在预期的MXBean不可用时继续运行应用程序,可以添加一些try / catch逻辑以正常处理ClassCastException。

转到窗口 – >首选项 – > Java – >编译器 – >错误/警告。 选择Deprecated和Restricted API。 将其更改为警告。 更改禁止和气馁参考并将其更改为警告。 (或根据需要。)

谢谢。

我找到的最佳解决方案是:

  • 转到项目属性中的“构建路径”设置。

  • 删除JRE系统库

  • 加回来; 选择“添加库”并选择JRE系统库。

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

这里解释了为什么开发人员不应该编写称为“sun”软件包的程序 。

OrientDB 在此处使用的解决方法是reflection。

举个例子:

 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) { }