为什么对于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系统库。
这里解释了为什么开发人员不应该编写称为“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) { }