Почему доступ ограничен 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), и я не хочу обходить это ограничение, если я собираюсь нарушить какое-то лицензионное соглашение. Может кто-нибудь помочь мне понять это?
4 ответа
Это не проблема лицензионных соглашений. Это просто Eclipse, пытающийся защитить вас от использования классов, которые не являются частью официального JDK API (скорее, частью реализации JVM в Oracle / Sun).
Есть ли конкретная причина, по которой вам нужно преобразовать класс (вместо использования "официального" интерфейса java.lang.management.OperatingSystemMXBean)?
Если вы хотите убедиться, что ваше приложение продолжает работать, когда ожидаемый MXBean недоступен, вы можете добавить некоторую логику try/catch для изящной обработки ClassCastException.
Перейдите в Окно -> Настройки ->Java-> Компилятор -> Ошибка / Предупреждения. Выберите Устаревший и Ограниченный API. Измените это на предупреждение. Измените Запрещенную и Обескураженную Ссылку и измените ее на предупреждение. (или как ваша потребность.)
Благодарю.
Лучшее решение, которое я нашел для этого:
Зайдите в настройки Build Path в свойствах проекта.
Удалить системную библиотеку 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) {
}