2010-01-21 3 views
0

есть ли способ узнать, какой конкретный объект доступен JVM или нет, прежде чем он выкинет ClassNotFoundException, чтобы мы могли пропустить этот доступ класса и можем использовать класс-заменитель во время выполнения.Как узнать, доступен ли конкретный класс JVM или нет?

+3

Можете ли вы не просто поймать 'ClassNotFoundException'? Но я думаю, что у вас есть более глубокие архитектурные проблемы, если вы это делаете. Изучите Google Guice (http://code.google.com/p/google-guise/) или Spring IoC (http://www.devshed.com/c/a/Java/The-Spring-Framework-Understanding- IoC /) ... вы, вероятно, найдете их очень полезными. –

ответ

1

Никто не говорил об этом, потому что для описанной проблемы, ловя ClassCastException действительно является лучшим способом ... однако ...

Если все, что вам нужно сделать, это проверка на существование файла .class на classpath, а затем попытка захвата класса в качестве ресурса может работать.

URL u = getClass().getResource("/java/util/List.class"); 

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

+0

Также обратите внимание, что это проверяет наличие файла класса. Он может присутствовать и оставаться незагружаемым (например, если классы, требуемые этим классом, не найдены). –

3

У вас есть соответствующий код? Не зная точно, что вы пытаетесь сделать, я бы сказал:

  1. Вы должны быть в состоянии убедиться, что все классы, которые вы ссылающиеся на ваши классах раньше время.

  2. Если вам нужно, вы можете просто поймать исключение ClassNotFound, где вы ожидаете, что это может произойти, а затем повторите попытку с другим типом.

+0

У меня нет образца кода. Но у меня есть сценарий, где у меня есть db2, а также оракул DB для доступа, где, если я не нахожу класс db2driver, я использую oracle или vice-versaw. надеюсь, что я понял – GuruKulki

+0

Конечно, но откуда, откуда эти драйверы? У вас есть они? Можете ли вы поместить их в путь класса? – danben

1

Я думаю, вам следует реализовать решение в обработчике исключений для исключения ClassNotFoundException.

Как вы хотите определить, доступен ли класс во время выполнения, нет способа узнать его перед выполнением программы.

0

Невозможно спросить загрузчика классов или вызвать Class.forName() без получения исключения, но это не повредит, если это происходит только во время init. Единственная возможность - проверить путь класса для db-jar в файловой системе. Но это было бы слишком большой работой для небольшой (или вообще нет) пользы.

Смежные вопросы