Вы не можете скомпилировать это на 1.5, но вы можете скомпилировать на 1.6 с параметром target, установленным на 1.5 (который будет производить байт-код для 1.5), и в коде, используя отражение, чтобы выяснить, доступен ли метод.
Этот код будет искать метод:
mbean.getClass (). getMethod ("findDeadlockedThreads", новый класс [0]);
Проблема в том, что он генерирует исключение NoSuchMethodException, если метод отсутствует, а не просто возвращает ноль или что-то подобное. Это означает, что вам нужен код, подобный следующему:
try
{
mbean.getClass().getMethod("findDeadlockedThreads", new Class<?>[0]);
return mbean.findDeadlockedThreads();
}
catch(NoSuchMethodException ex)
{
return mbean.findMonitorDeadlockedThreads();
}
Это не очень хорошо, потому что для принятия решения используется исключение. Это, вероятно, не очень быстро. Альтернатива - вместо этого использовать getMethods и перебирать возвращаемый список, если ваш метод доступен. Это тоже не очень быстро.
РЕДАКТИРОВАТЬ: Кристофер Oezbek предлагает в комментариях сделать проверку существования метода только один раз и сохранить результат, чтобы избежать накладных расходов для блока Try-catch. Это правильное и хорошее решение. matt b предупреждает, что опция target Java-Compiler не проверяет, доступны ли используемые классы и методы в Java 1.5. Это верно (а иначе это не сработает, потому что вы хотите скомпилировать по 1.6-методу), и это означает, что программа должна быть тщательно протестирована под 1.5-VM, чтобы избежать этой проблемы. Спасибо за ваши комментарии оба.