Инициализация переменных с SideOnly аннотацией

Версия Minecraft
1.7.10

tox1cozZ

aka Agravaine
8,453
599
2,906
Когда пытаюсь объявить переменную с SideOnly(Side.CLIENT) и сразу же её инициализировать - крашится.
Java:
@SideOnly(Side.CLIENT)
public static List<String> messages = Lists.newArrayList();
Такое не пашет. Как можно это исправить? А то хз где такие переменные инициализировать...
 
Решение
Это происходит из-за того, что поле выпиливается, а вот сама инициализация происходит в clinit. Поэтому получается инициализация несуществующего поля и из-за этого все падает.
Я как-то очень давно запилил себе костыль на асме именно для фикса это проблемы. Помечаю метод внутри класса своей аннотацией и инжектю его перед всеми return в главных конструкторах.
До этого костыля инициализировал через прокси.
Такая же проблема была, давно. В итоге совсем отказался от этих аннотаций. Слишком непрактично, и иногда порой непонятно в каком месте из-за них краш возникает

А зачем тебе-то лист со строками помечать сайдонли?
 
Как правило, если я не забыл за то время пока их не юзал, эти аннотации используют для того чтобы с сервера ненароком не вызвать метод какого-нибудь клиенсткого гуи и подобных классов. Без них можно обойтись
 
Это происходит из-за того, что поле выпиливается, а вот сама инициализация происходит в clinit. Поэтому получается инициализация несуществующего поля и из-за этого все падает.
Я как-то очень давно запилил себе костыль на асме именно для фикса это проблемы. Помечаю метод внутри класса своей аннотацией и инжектю его перед всеми return в главных конструкторах.
До этого костыля инициализировал через прокси.
 
Проблема заключается скорее всего в том, что метод (переменная) использует какой то import, а так как на import такое поставить нельзя, то серверная сторона тупо крашится, потому что в ней такого пространство имен не существует (который указан в import)
это всё равно что писать аддон для мода, который ты привязал как зависимости. Но после компиляции от него останутся импорты. И если самого мода в окружении не будет на стороне запуска, то твой мод также ёкнется.
 
Это происходит из-за того, что поле выпиливается, а вот сама инициализация происходит в clinit. Поэтому получается инициализация несуществующего поля и из-за этого все падает.
Я как-то очень давно запилил себе костыль на асме именно для фикса это проблемы. Помечаю метод внутри класса своей аннотацией и инжектю его перед всеми return в главных конструкторах.
До этого костыля инициализировал через прокси.
А никак нельзя выпилить это из clinit?
метод (переменная) использует какой то import
Импортов вообще нет в байткоде, они сделаны чисто для удобства программиста чтобы не писать полный путь к классу.
 
Вот да, фиг знает как парсить это дело... Там ведь может быть как просто создание инстанса, так и вызов какого-то метода.
Походу буду делать как ты) В принципе, идея вроде нормальная.
 
Назад
Сверху