Почему доступ к ресурсу jre6/lib/rt.jar ограничен для OperatingSystemMxBean?
У меня небольшая проблема с некоторым кодом Java, который я пытаюсь скомпилировать в Eclipse. Я продолжаю получать следующее предупреждение...
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), и я не хочу обойти это ограничение, если я собираюсь нарушая какое-то лицензионное соглашение. Может ли кто-нибудь помочь мне понять это?
Ответы
Ответ 1
Это не проблема лицензионных соглашений. Просто Eclipse пытается защитить вас от использования классов, которые не являются частью официального JDK API (а скорее являются частью реализации Oracle/Sun JVM).
Есть ли какая-то конкретная причина, по которой вам нужно выполнить класс (вместо использования "официального" интерфейса java.lang.management.OperatingSystemMXBean)?
Если вы хотите, чтобы ваше приложение продолжало работать, когда ожидаемый MXBean недоступен, вы можете добавить логику try/catch, чтобы изящно обрабатывать ClassCastException.
Ответ 2
Перейдите в Window → Preferences → Java → Compiler → Error/Warnings.
Выберите устаревший и ограниченный API. Измените его на предупреждение.
Измените запрещенную и отвратительную ссылку и измените ее на предупреждение. (или как ваша потребность.)
Спасибо.
Ответ 3
Лучшее решение, которое я нашел для этого:
fooobar.com/questions/5769/...
Ответ 4
Здесь объясняется Почему разработчики не должны писать программы
Это пакеты вызовов "sun" .
Обходной путь, используемый 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) {
}