Вызов функции на основе версии JVM - PullRequest
0 голосов
/ 05 декабря 2009

У меня есть объект JFrame, и мне нужно поддерживать два JVM 1.5 в Mac OS X и 1.6 в Windows. В окнах мне нужно использовать функцию setIconImages, чтобы установить несколько значков для приложения, но эта функция недоступна в версии 1.5. Можно ли вызвать эту функцию внутри JFrame с отражением?

Application extends JFrame{
.
.
.
  void init(){
   //check version
   //call setIconImages 
  }

}

Ответы [ 5 ]

2 голосов
/ 05 декабря 2009

Я бы сделал что-то вроде следующего (не компилируется, но должен начать):

создайте класс с именем FrameUtils и присвойте ему следующий метод:

public static void setIconImages(final java.awt.Window window, 
                                 final List<? extends Image> icons) 
{
    try
    {
        Method setIconImagesMethod;

        setIconImagesMethod = // use reflection to get the setIconImages method. 
        setIconImagesMethod.invoke(window, icons);
    }
    catch(final NoSuchMethodException ex)
    {
        // fall back to the single image method
        window.setIconImage(icons.get(0));
    }
}

Эта ссылка показывает, как получить метод и вызвать его с помощью отражения.

1 голос
/ 05 декабря 2009

Поскольку вам приходится компилировать обе версии jdk по отдельности, вероятно, лучшим решением будет иметь интерфейс для вещей, которые не работают на старом jdk, и две его реализации. Затем загрузите нужную реализацию при запуске.

0 голосов
/ 05 декабря 2009

Если вы можете скомпилировать с Java 1.6, простой способ сделать это, перехватив NoSuchMethodError. Ниже приведен пример из моего кода, который получает границы экрана, учитывающие панель задач, но возвращается к полному пределу, если версия Java слишком ранняя:

try {
    sb=wnd.getGraphicsConfiguration().getBounds();
    }
catch(NoSuchMethodError thr) {
    Dimension ss;
    ss=wnd.getToolkit().getScreenSize();
    sb=new Rectangle(0,0,ss.width,ss.height);
    }

Если вам нужно использовать отражение (потому что J6 изменил версию класса, и вы должны скомпилировать в J5), вам просто нужно извлечь метод J6 с отражением и перехватить MethodNotFoundException для выполнения резервного вызова.

0 голосов
/ 05 декабря 2009

Да, рефлексия - путь для этой цели.

Я видел этот трюк в некоторых библиотеках, где требуется «обратная сопоставимость». двоичный файл должен работать на более старых виртуальных машинах, поэтому к новым API следует обращаться через рефлексию.

0 голосов
/ 05 декабря 2009

Похоже, javax.swing.JFrame в Java 1.5 имеет функцию setIconImage () . Зачем вам нужно установить несколько изображений?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...