ClassLoader

Версия Minecraft
0.1+
1,111
47
420
Ну в принципе, почему бы и не да...
Так, насколько вы все знаете общение с плагинами Bukkit на прямую невозможно. По той простой причине, что у них разные ClassLoader'ы. Поэтому обычно я достаю ClassLoader какого нибудь произвольного плагина и загружаю какой то мой класс через него. Этот способ, как по мне, лучше чем дергать методы плагина рефлекшеном, потому что этих самых вызовов может быть достаточно дофига.
Суть моего вопроса такова. Я заметил что ядро Bukkit грузится LaunchClassLoader. На сколько мне известно это дефолтный ClassLoader. В то же время моды майна грузятся, очевидно, другим лодером(здесь и далее ClassLoader), но "общение" между ядром Bukkit и модом возможно на прямую, а вот между плагином и модом не возможно. Вопрос таков: почему так происходит?.
Я конечно пробывал поискать доки, но я даже не знаю как правильно составить запрос .__.
 
1,111
47
420
через ядро объедины
:unsure:
Чот для меня тотально непонятно как происходит это объединение. Существует какая то иерархия ClassLoader'ов что ли?
Не понимаю как добиться такого эффекта чтоб я классом загруженым одним лодером мог обратиться к тому кто загружен другим. На самом деле это решило бы кучу проблем.
 
476
9
39
ты при загрузке сервера рефлексию юзай для получения нужных классов, а дальше без нее
 
1,111
47
420
Класс то я с легкостью могу получить без рефлекшена так то, а вот вызвать метод этого класса без рефлекшена я не смогу.

Немного по изучав этот вопрос, я выяснил как работает модель загрузки классов:
1) Системный загрузчик попытается поискать в кеше класс.
_1.1) Если класс найден, загрузка окончена.
_1.2) Если класс не найден, загрузка делегируется загрузчику расширений.
2) Загрузчик расширений попытается поискать в кеше класс.
_2.1) Если класс найден, загрузка окончена.
_2.2) Если класс не найден, загрузка делегируется базовому загрузчику.
3) Базовый загрузчик попытается поискать в кеше класс.
_3.1) Если класс найден, загрузка окончена.
_3.2) Если класс не найден, базовый загрузчик попытается его загрузить.
__3.2.1) Если загрузка прошла успешно, она закончена ;)
__3.2.2) Иначе управление предается загрузчику раширений.
_3.3) Загрузчик расширений пытается загрузить класс.
__3.3.1) Если загрузка прошла успешно, она закончена ;)
__3.3.2) Иначе управление предается системному загрузчику.
_3.4) Системный загрузчик пытается загрузить класс.
__3.4.1) Если загрузка прошла успешно, она закончена ;)
__3.4.2) Иначе генерируется исключение java.lang.ClassNotFoundException.

Выходит что у ClassLoader'ов действительно существует иерархия, что объясняет почему я мог обращаться к классам Bukkit или FML. Мое предположительное решение заменить текущий загрузчик на свой который будет ребенком сразу и FML и Bukkit. Осталось только понять как это сделать.
 
7,099
324
1,510
1) Системный загрузчик попытается поискать в кеше класс.
_1.1) Если класс найден, загрузка окончена.
_1.2) Если класс не найден, загрузка делегируется загрузчику расширений.
2) Загрузчик расширений попытается поискать в кеше класс.
_2.1) Если класс найден, загрузка окончена.
_2.2) Если класс не найден, загрузка делегируется базовому загрузчику.
3) Базовый загрузчик попытается поискать в кеше класс.
Бюрократия?
 
476
9
39
Множественное наследование в джавке нету. А иногда это так надо. Во всяком случае тебе придется написать один независимый лаодер на основе тех двух. Или пронаследовав от одного и дополнив функционалом другого.
Сорри, лодку мне, несу какой-то бред
 
1,111
47
420
Множественное наследование в джавке нету.
А это тут при чем?
Во всяком случае тебе придется написать один независимый лаодер на основе тех двух.
Мое предположительное решение заменить текущий загрузчик на свой который будет ребенком сразу и FML и Bukkit.
 
476
9
39
заменить текущий загрузчик на свой который будет ребенком сразу и FML и Bukkit
Ну раз ребенок то родители т.е наследуемый от обоих сразу :\ я буквально воспринимаю всё.
Но мне самому интересно, что же ты придумаешь, как допишу миникарту может тоже посмотрю что можно придумать.
 
1,111
47
420
Я взял термос и объединил ClassLoader модов и плагинов. Этот вариант подходит для тех у кого есть доступ к ядру. Для тех же у кого нет есть другой варинт. При инициалализации мода сделать ClassLoader который я описывал выше, загрузить через него ваши прокси, а дальше, так как он будет являться текущим, все последующие классы будут грузиться через него. Вот и решение вопроса вроде бы.
 
Сверху