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

时间:2010-11-15 11:24:52

标签: java

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

4 个答案:

答案 0 :(得分:13)

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

是否有特殊原因需要进行分组转换(而不是使用the "official" interface java.lang.management.OperatingSystemMXBean)?

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

答案 1 :(得分:13)

转到窗口 - >首选项 - > Java - >编译器 - >错误/警告。 选择已弃用和受限制的API。将其更改为警告。 更改禁止和气馁参考并将其更改为警告。 (或根据需要。)

感谢。

答案 2 :(得分:10)

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

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

  • 删除JRE系统库

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

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

答案 3 :(得分:2)

这里解释Why Developers Should Not Write Programs That Call 'sun' Packages

OrientDB here使用的解决方法是反思。

举个例子:

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