![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| sergioK |
|
|||
|
Бывалый ![]() Профиль Группа: Awaiting Authorisation Сообщений: 207 Регистрация: 15.2.2008 Репутация: нет Всего: нет |
в поике искал не нашел разбираю пример
|
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Стандартный алгоритм такой: вначале ClassLoader проверяет родительский класс лоаден не был ли им загружен этот класс. Потом проверяет не был ли он загружен им самим. В примере для хранения загруженных классов используется
Затем если класс не найден, то читается class-файл и вызывается defineClass(). -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| sergioK |
|
||||
|
Бывалый ![]() Профиль Группа: Awaiting Authorisation Сообщений: 207 Регистрация: 15.2.2008 Репутация: нет Всего: нет |
почему если поменять Demo на другое имя то выходит Exception in thread "main" java.lang.NoClassDefFoundError: Demo1 (wrong name: Demo)? c = loader.loadClass("Demo", true); |
||||
|
|||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Ну так уж и любое, попробуй java.lang.Object
Этот ClassLoader умеет грузить только один класс Demo который зашит в него, ничего другого он грузить не умеет. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| sergioK |
|
||||
|
Бывалый ![]() Профиль Группа: Awaiting Authorisation Сообщений: 207 Регистрация: 15.2.2008 Репутация: нет Всего: нет |
дак это не понятно , они написали некий класс demo как его сделать зашитым ? Я проверил с java.awt.Rectangle - работает с java.awt.Rectangle работает но это java.awt.Rectangle - таки вшит в JVM попробовал
получаю Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/rowset (wrong name: Demo) в чем разница полный пример взят здесь http://www.java2s.com/Code/Java/Language-B...ClassLoader.htm т,е, дальше видно что в этом самом demo есть метод test , и как на это самый demo попал в "мою" JVM |
||||
|
|||||
| LSD |
|
||||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Интересно ты разбираешься, даже не читаешь сам код
других классов они туда не зашили, а потому он ничего больше и не может грузить (ну кроме стандартных классов, для которых используется системный ClassLoader). Посмотри пример загрузчика классов у нас в FAQ. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
||||
|
|||||
| sergioK |
|
|||
|
Бывалый ![]() Профиль Группа: Awaiting Authorisation Сообщений: 207 Регистрация: 15.2.2008 Репутация: нет Всего: нет |
как обычно у программеров
сначало доходишь сам потом находишь тоже самое в документации млять никогда не бывает наоборот если кому интересно то The specified name cannot begin with "java.", since all classes in the "java.* packages can only be defined by the bootstrap class loader. If name is not null, it must be equal to the binary name of the class specified by the byte array "b", otherwise a NoClassDefFoundError will be thrown. взято http://java.sun.com/j2se/1.5.0/docs/api/ja....String,%20byte[],%20int,%20int) Это сообщение отредактировал(а) sergioK - 5.7.2008, 09:01 |
|||
|
||||
| Ratman |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 18.8.2007 Где: Минск Репутация: нет Всего: нет |
А если класс уже однажды был загружен? как его "выгрузить" У меня алгоритм такой: 1 - создается .class файл 2 - загружается этот класс 3 - используется 4 - немного изменяется .class файл 5 - хотелось бы его перезагрузить и использовать Но на практике ClassLoader помнит, что такой класс уже загружен, и не загружает новый (измененный) а возвращает уже загруженный. К тому же findLoadedClass объявлен гадасць как final, значит способов "помешать" найти однажды загруженный класс я не вижу. ЗЫ: честно, каждый раз менять имя, конечно, не сложно, но уж очень некрасиво. ЗЗЫ: заранее спасибо Это сообщение отредактировал(а) Ratman - 19.7.2008, 23:32 |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |