Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

[Решено] Mojang AuthLib и Java Reflection...

Тема в разделе "Обсуждение Minecraft", создана пользователем Reality_SC, 17 апр 2014.

Статус темы:
Закрыта.
  1. Автор темы
    Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Здравствуйте, прошу небольшой совет.

    Я пишу небольшой класс-враппер для minecraft.jar.
    В нём я конструирую новый URLClassLoader со списком URL до всех стандартных майновских библиотек и до самого себя (minecraft.jar); указываю parent class loader = null.
    Затем, используя его, загружаю с инициализацией несколько классов из AuthLib и с помощью рефлексии подменяю им private static final URL поля на свои значения. Тут всё происходит удачно.
    JD-GUI показывает, что эти поля в свою очередь конструируются через вызовы метода другого класса (хотя по факту он делает new URL(url)), что вроде бы должно на 99% предупредить их inline-овость при компиляции (см. JLS 15.28).
    Затем переключаю контекстный класслоадер текущего потока на новый, достаю main класс игры, и запускаю его.

    Проблема: игра всё равно пытается достучаться до старых URL.
    Что я мог упустить?
     
    Fourgotten нравится это.
  2. Хостинг MineCraft
    <
  3. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Заем такое изврщение? Тупо передать майн классу класспатчи и все не?
     
  4. Konstantin773

    Konstantin773 Старожил Пользователь

    Баллы:
    153
    Skype:
    Konstantin77313
    Имя в Minecraft:
    K773
    Поля с модификатором final являются константами, их значения не меняются ни при каких обстоятельствах.

    В твоем случае все URL инициализируются в момент загрузки класса и последующие операции с Reflection API не смогут изменить значения final-полей

    Убери со всех меняемых полей модификатор final и будет тебе счастье. (*но осторожней, объявление констант обычными полями может аукнуться последствиями)
     
    Последнее редактирование: 18 апр 2014
  5. Автор темы
    Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Konstantin773, поля эти внутри моджанговской библиотеки, и перекомпилировать я ее не хочу, соответственно и убрать final из кода не могу. Но я снимаю флаг final после загрузки класса класслоадером, класс инициализирован, значит инициализирующее значение не перезапишет мое. После подмены возвращаю и final, и private.

    alexandrage, можешь выразиться чуть более подробно, я не очень уловил. Тем временем пойду прогуглю эти словосочетания...[DOUBLEPOST=1397832063,1397794148][/DOUBLEPOST]Вечерний ап.
    Ничего нового никто не может предложить? Я в тупике)
     
  6. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Если тебе нужен тупо запуск, погляди в сашке.
     
  7. Автор темы
    Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Через некоторое время был найден ответ, но я забыл про него сразу написать.
    В клиент был вшит LiteLoader, который сам создавал собственный ClassLoader и, соответственно, подменяемые классы имели новые instance-ы.
    Решение оказалось простым, нужно проводить подмену в рамках конечного КлассЛоадера, для чего один из классов реализовал интерфейс ITweaker и был передан как --tweakClass путь.к.классу.

    Тема закрыта.
     
    Последнее редактирование: 1 апр 2015
    Fourgotten нравится это.
Статус темы:
Закрыта.

Поделиться этой страницей