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