Определить, является ли класс Java загружаемым - PullRequest
0 голосов
/ 10 ноября 2009

У меня есть две программы: одна программа CLI и одна GUI. GUI является интерфейсом для CLI, но также и GUI для другой программы.

Я импортирую классы CLI и расширяю их в GUI для добавления элементов GUI в классы, и все отлично.

Но теперь я хочу разделить CLI, который я сейчас встроил в GUI (как включенный JAR). JAR находится в фиксированном месте (/opt/program/prog.jar), и приложение будет использоваться только в Linux, поэтому я понимаю, что это нарушает традиционную мысль Java.

Я отредактировал ClassPath в файле манифеста, чтобы отразить это изменение, и он отлично работает. Однако, когда я удаляю файл, графический интерфейс не загружается, ссылаясь на невозможность загрузить класс.

Есть ли способ попробовать загрузить класс и, если он не работает, сделать что-то еще? По сути, я пытаюсь поймать исключение ClassNotFound, но пока не получилось.

Ответы [ 2 ]

6 голосов
/ 10 ноября 2009

Один из распространенных способов проверки существования класса - это просто сделать Class.forName («my.Class»). Вы можете обернуть это с помощью метода try / catch, который перехватывает ClassNotFoundException и решает, что делать. Если вы хотите, вы можете сделать это в классе-оболочке, который имеет main (). Вы можете попытаться загрузить класс и, если это удастся, вызвать main () для загруженного класса и, если нет, сделать что-то еще.

public static void main(String arg[]) {
  try { 
    Class.forName("my.OtherMain");

    // worked, call it
    OtherMain.main();
  } catch(ClassNotFoundException e) {
    // fallback to some other behavior
    doOtherThing();
  }
} 
1 голос
/ 10 ноября 2009

Есть ли способ попробовать загрузить класс и, если он не работает, сделать что-то еще?

Предполагается, что у вас есть файл класса в C: \ с именем Foo.class

public static void main(String[] args) {

    File f = new File("c:\\");
    if (f.exists()) {
        URLClassLoader CLoader;
        try {
            CLoader = new URLClassLoader(new URL[]{f.toURL()});
            Class loadedClass = CLoader.loadClass("Foo");
        } catch (ClassNotFoundException ex) {
        } catch (MalformedURLException ex) {
        }

    } else {
        //do something else...
    }

}
...