代码之家  ›  专栏  ›  技术社区  ›  Mister Dai

为什么要限制对jre6/lib/rt.jar的访问来操作SystemXBean?

  •  16
  • Mister Dai  · 技术社区  · 16 年前

    我在尝试用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 回复  |  直到 16 年前
        1
  •  13
  •   Thilo    16 年前

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

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

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

        2
  •  14
  •   Zohaib    13 年前

    转到“窗口”->“首选项”->“Java”->“编译器”->“错误/警告”。 选择Deprecated and Restricted API。改为警告。 更改禁止和阻止引用并将其更改为警告。(或根据您的需要。)

    谢谢。

        3
  •  9
  •   Community Mohan Dere    9 年前

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

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

    • 删除JRE系统库

    • 将其添加回去;选择“添加库”并选择JRE系统库。

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

        4
  •  4
  •   IvanRF    10 年前

    这里是解释 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) {
    }