[Гайд][Легко][1.6+] Модификация чужого кода при запуске (трансфомеры)

5,024
47
784
...ой:)
 
5,024
47
784
Как всунуть свои перечисления в enum через @Hook ? Короче говоря есть класс 
Код:
public static enum ToolMaterial{
   WOOD(0, 59, 2.0F, 0.0F, 15),
        STONE(1, 131, 4.0F, 1.0F, 5),
        IRON(2, 250, 6.0F, 2.0F, 14),
        DIAMOND(3, 1561, 8.0F, 3.0F, 10),
        GOLD(0, 32, 12.0F, 0.0F, 22);

        /** The level of material this tool can harvest (3 = DIAMOND, 2 = IRON, 1 = STONE, 0 = WOOD/GOLD) */
        private final int harvestLevel;
        /** The number of uses this material allows. (wood = 59, stone = 131, iron = 250, diamond = 1561, gold = 32) */
        private final int maxUses;
        /** The strength of this tool material against blocks which it is effective against. */
        private final float efficiencyOnProperMaterial;
        /** Damage versus entities. */
        private final float damageVsEntity;
        /** Defines the natural enchantability factor of the material. */
        private final int enchantability;
        //Added by forge for custom Tool materials.
        private ItemStack repairMaterial = ItemStack.EMPTY;
        
Понятное дело Enum -это просто тип класса и во все его методы можно точно также засовывать хуки. Вопрос лишь в том, что мне надо засовывать хук в конструктор, а без конструктора невозможно создать перечисление. Но если я сделаю свой то внутри енума нельзя создать конструктор с модификаторами public static . Что делать?


Ну или на крайняк - можно как то перенаправлять запрос майна к public enum ToolMaterialCustom , а не ванильному?
 
2,505
81
397
Maxik001 написал(а):
Вопрос лишь в том, что мне надо засовывать хук в конструктор
В чем проблема?
Maxik001 написал(а):
а без конструктора невозможно создать перечисление
Конструктор есть всегда.
 
5,024
47
784
Dahaka написал(а):
Maxik001 написал(а):
Вопрос лишь в том, что мне надо засовывать хук в конструктор
В чем проблема?

Проблема в том, что хук вставляется только если конструктор public static . Внутри енума public static конструктор писать нельзя.
 
2,505
81
397
public static конструктор? Тебе не помешало бы подучить java.
 
5,024
47
784
Dahaka написал(а):
public static конструктор? Тебе не помешало бы подучить java.

тьфу ты ну блин. Я знаю, вы неправильно поняли. я про это
Код:
@Hook(targetMethod = "<init>")
public static void blockSandConstructor(BlockSand blockSand, int id){
    System.out.println("Constructing BlockSand!");
}

public static void нельзя сделать в енуме.
 
808
3
124
Для добавления значений в енамы в фордже есть штука под названием EnumHelper. Правда, она сломается с Java 9 (а релиз-то через месяц :V), но пока есть. Добавить значение енама через хуклибу, насколько я знаю, невозможно. Вполне реально ручками через ASM, но это довольно геморно, готового кода я нигде не видел.
 
476
9
39
Интересно, а поля можно таким образом добавлять?
И например указать сразу статичное там поле будет или нет? Можно, конечно, попробовать сделать через хук-класс объявив там глобальну.. тьфу то есть публичную переменную, но мне необходимо на каждый экземпляр определённого класса иметь одну такую переменную.
Вот.
Спасибо.
В общем придумал.
Вынести в отдельный класс, модифицировать конструктор оригинального класса. И переменные будут внутри экземпляра модифицированного класса доступны через экземпляр нового класса.
Осталось лишь сделать его доступным для себя. Хм, просто добавить метод что-то вроде getNewClass(){}... Но ведь нда...
Ладно может прокатит сделать просто новый метод, который будет возвращать нужный мне класс с переменными, сделать его final и, если я всё правильно понимаю то метод в следующий раз при вызове не будет создавать новый объект если в нём указан return new NewClass();
Что-то я намудрил.
 
2,505
81
397
Допустим, добавил поле в класс. А как его доставать? Рефлексией?
 
7,099
324
1,510
Для каких-то больших разработок можно юзать sponge mixin framework.
 
476
9
39
Dahaka написал(а):
Допустим, добавил поле в класс. А как его доставать? Рефлексией?

Или так или патчить исходники. 
Да и у майна есть хороший ReflectionHelper, почти ничего делать не надо.
 
7,099
324
1,510
Рефлексия медленная
 
476
9
39
hohserg написал(а):
Рефлексия медленная

Spring на ней целиком и полностью построен. По крайне мере я так слышал
 

tox1cozZ

aka Agravaine
8,456
598
2,893
hohserg написал(а):
Agravaine написал(а):
Странно, но если неявно трогать объект класса, то будет вываливаться ClassNotFoundException.
Не знаю, нужно ли тебе, или нет, но я нашел такой комментарий в hooklib.asm.SafeClassWriter:
Код:
/**
 * ClassWriter с другой реализацией метода getCommonSuperClass: при его использовании не происходит загрузки классов.
 * Однако, сама по себе загрузка классов редко является проблемой, потому что инициализация класса (вызов статических
 * блоков) происходит не при загрузке класса. Проблемы появляются, когда хуки вставляются в зависимые друг от друга
 * классы, тогда стандартная реализация отваливается с ClassCircularityError.
 */
Кажется, из-за этого у тебя вываливался ClassNotFoundException.

И что мне это дает?
 
А можно ли с помощью этих хуков изменить суперкласс?
 
Сверху