Загрузка класса в интерфейс - PullRequest
       17

Загрузка класса в интерфейс

0 голосов
/ 14 сентября 2010

Я довольно ограничен в платформе, над которой я сейчас работаю (JDK 1.3, BD-J).Один файл JAR, который я хотел бы использовать для попыток выполнить проверку самосохранения при загрузке, и в случае неудачи он переходит в неработоспособное состояние.Довольно сложно выяснить, почему это происходит, но большинство источников указывают на то, что он не может самостоятельно найти / получить доступ к нему через структуру BD-J, поэтому он умирает.

Это исключает использование его во время загрузки и вместо этогозагрузить его в самом приложении.Это довольно большая библиотека, поэтому мне нужно создать довольно много интерфейсов, чтобы я мог привести к ней загруженный объект и потенциально использовать его.Вот где моя проблема.

Интерфейсы загружаются в обычное время загрузки, а затем библиотека загружается во время выполнения и приводится к ранее загруженным интерфейсам, это проблема?Я получаю ClassCastException

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

Интерфейсные пакеты в моем проекте отличаются от пакета инструментов, не так ли?

У меня заканчиваются идеи,я что-то упустил из виду?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 14 сентября 2010

Скорее всего, классы загружаются разными загрузчиками классов. http://mindprod.com/jgloss/classloader.html может дать некоторое представление.

0 голосов
/ 14 сентября 2010

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

0,1. Классы, которые вы хотите использовать, не реализуют никакого интерфейса.

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

0,2. Классы, которые вы хотите реализовать, реализуют некоторый интерфейс, который вы пытаетесь воспроизвести.

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

Если они используют какой-то сумасшедший внутренний загрузчик классов, они все равно могут попытаться загрузить свои собственные интерфейсы. Вы можете попытаться выяснить, так ли это, используя «-XX: + TraceClassLoading», хотя я не знаю, поймет ли эта опция 1.3 jre.

Теперь, если вы хотите больше экспериментировать, вы также можете попробовать другой подход. Напишите свой собственный загрузчик классов, который загружает как классы из этого jar, так и код, который вы хотите запустить. Таким образом, ваш код сможет напрямую ссылаться на классы в этом фляге, но для запуска вашего приложения «основным» методом должен быть тот, который инициализирует этот загрузчик классов, загружает «настоящий» основной класс с помощью отражения и выполняет его метод main () также с помощью отражения.

...