Таким образом, я динамически загружаю флягу во время выполнения, как я использую это? - PullRequest
1 голос
/ 26 апреля 2010

Итак, вопрос 194698 показывает, как загрузить файл JAR во время выполнения, и как вы можете загрузить отдельные именованные классы и получить объект Class. Теперь моя проблема в том, что я хочу иметь возможность приводить эти классы к типам, которыми они на самом деле являются, но я не могу, потому что я не могу использовать импорт, поскольку весь смысл в том, чтобы загрузить его во время выполнения, а не во время компиляции.

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

Есть ли лучший способ?

Ответы [ 2 ]

3 голосов
/ 26 апреля 2010

Обычный способ - использовать динамически загружаемые классы через четко определенный интерфейс (как показано в принятом ответе на вопрос, который вы связали, с Runnable). Таким образом, детали их реализации могут свободно изменяться, если они реализуют интерфейс. Таким образом, вы приводите экземпляр загруженного класса к этому интерфейсу внутри блока try, перехватываете и обрабатываете ClassCastException в случае, если класс не реализует интерфейс (это не показано в ответе, упомянутом выше, но тривиально добавить), или используй его долго и счастливо.

1 голос
/ 26 апреля 2010

Если вы не знаете, какие классы доступны, и какой у них интерфейс, у вас нет или очень мало возможностей их использовать (люди с трудом знают интерфейс)

Обычно эти модули «расширения» кодируются для определенного интерфейса, поэтому у новых загруженных классов всегда будут определенные методы (т. Е. Драйвер JDBC всегда ожидает найти реализацию PreparedStatement, ResultSet и т. Д. И т. Д. И т. Д.) когда он не знает, что еще под ним)

В вашем случае, и если вы хотите загружать и использовать произвольные классы, единственный оставшийся ресурс, который я вижу, - это предоставить некоторый механизм для добавления языка сценариев (такого как Groovy, Jython или JRuby) и кода в обнаруженный интерфейс.

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