2009-08-31 8 views
1

Я хотел бы быть в состоянии сделать что-то вроде (псевдо-код):Можно ли определить, доступен ли класс на Java?

if (classAvailable) { 
    // do a thing 
} else { 
    // do a different thing 
} 

Что бы еще лучше, если бы я мог расширить класс от ClassA, если он доступен или ClassB, если это не , Я подозреваю, что это невозможно.

+1

Что означает 'доступные'? Вы загружаете их через отражение? –

+0

Я пишу библиотеку для Android. Начиная с Android 1.5 существует класс AsyncTask, который я бы хотел использовать, если он доступен, в противном случае я бы хотел использовать не-родной класс, который делает то же самое. Я бы предпочел родной, поскольку он (предположительно) будет поддерживаться. –

ответ

1

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

Вы можете сделать это в Python, хотя ;-)

6

Вы можете сделать первую часть:

try { 
    Class.forName("my.ClassName"); 
    // It is available 
} 
catch (ClassNotFoundException exception) { 
    // It is not available 
} 
+0

Это не поможет, если он все еще пытается ссылаться на него статически ... –

+1

Статическая ссылка 'my.ClassName' просто не скомпилируется, если класс недоступен во время компиляции. Это не выход, если класс «может» или «не может быть» доступен. –

2

Мой обычный подход к этому является:

Отдельные из кода, который использует дополнительную библиотеку в другой исходный каталог. Он должен реализовывать интерфейсы и обычно зависит от основного каталога источника.

Чтобы обеспечить соответствие зависимостей в сборке, скомпилируйте основной каталог источника без дополнительной библиотеки, а затем источник, который зависит от дополнительной библиотеки (с другим файлом класса из другого исходного каталога и библиотеки на пути к классу компилятора) ,

Основной источник должен попытаться загрузить один корневой класс в дополнительном исходном каталоге динамически (Class.forName, asSubclass, getConstructor, newInstance). Статический intialiser корневого класса должен проверять, действительно ли библиотека доступна, и выдает исключение, если это не так. Если корневой класс не загружается, возможно, следуйте за шаблоном Null Object.

0

В случае, если вы используете Spring, попробуйте использовать org.springframework.util.ClassUtils # isPresent