Java 为什么对jre6/lib/rt.jar的访问被限制用于操作SystemMXBean?

Java 为什么对jre6/lib/rt.jar的访问被限制用于操作SystemMXBean?,java,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.ma

我试图在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();

我已经找到了解决这个问题的方法,但我担心限制警告。这段代码是为我的开源项目()编写的,如果我要破坏某种许可协议,我不想绕过这个限制。有人能帮我理解吗?

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

是否有特定的原因需要类强制转换(而不是使用)

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

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


谢谢。

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

  • 转到项目属性中的生成路径设置

  • 删除JRE系统库

  • 把它加回去;选择“添加库”并选择JRE系统库

这里解释一下

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

谢谢你,蒂洛。那对我来说就清楚了。我铸造它是为了获得Oracle/Sun实现中的getProcessCpuTime()方法。我是Java新手,所以不知道它不是一个官方API。不过,我会考虑使用“试一试”接球,因为如果它不会一直在那里的话,这很有意义:)干杯!我认为最好在项目设置级别上覆盖此选项。我只是在尝试解决问题时偶然发现了此选项,结果成功了。超级简单,没有混乱的特殊情况。谢谢