Comments 11
Ух ты, ничего себе. А я буквально сейчас ковырялся в истории нашего гита, чтобы найти изначальных авторов этого проекта. Думал, немец какой-то, судя по изначальному пакету de.fernflower
. Не знаю, на чём вы карму просадили, но плюсик от меня заслужили :-) JetBrains у вас купил проект или вы были сотрудником компании?
ЗЫ. Иногда кажется, что весь софт в мире русскоязычными людьми писан :-)
Замечательно, давайте сгенерируем корректный класс с именем из цифр. Возьмём любимый ASM и вперёд.
IMHO, использовать ASM для генерации «хитрых» классов неудобно, слишком много танцев с бубном.
Лучше взять asmtools:
super public class "42"
version 50:0
{
private Method "<init>":"()V"
stack 2 locals 1
{
aload 0;
invokespecial Method java/lang/Object."<init>":"()V";
getstatic Field java/lang/System.out:"Ljava/io/PrintStream;";
ldc String "In constructor!";
invokevirtual Method java/io/PrintStream.println:"(Ljava/lang/String;)V";
return;
}
public static Method main:"([Ljava/lang/String;)V"
stack 2 locals 1
{
getstatic Field java/lang/System.out:"Ljava/io/PrintStream;";
ldc String "Hello World!";
invokevirtual Method java/io/PrintStream.println:"(Ljava/lang/String;)V";
return;
}
} // end Class 42
К слову, в ConverterHelper.java есть ещё как минимум одна ошибка:
private static final Set<String> RESERVED_WINDOWS_NAMESPACE = new HashSet<>(Arrays.asList(
"aux", "prn", "aux", "nul",
Очевидно, что вместо одного из "aux"
должен быть "con"
.
Тут не помешала бы инспекция, отлавливающая дубликаты в коллекции, используемой для инициализации множества.
IMHO, использовать ASM для генерации «хитрых» классов неудобно, слишком много танцев с бубном.
Ну так-то у меня не сильно длиннее. Стоит на самом деле ByteBuddy попробовать, говорят, вкусно.
Тут не помешала бы инспекция, отлавливающая дубликаты в коллекции, используемой для инициализации множества.
Думали об этом. Может и сделаем.
Длина тут дело десятое, всё равно заготовку кода чаще всего получают, натравливая Asmifier на class-файл, а не пишут всё руками с нуля.
Но в случае использования ASM нужно:
0) добавить к сгенерированному коду обвязку для записи в файл (он её, вроде бы, не генерирует)
1) скомпилировать генератор
2) запустить генератор
В случае asmtools пункты 0 и 1 не нужны.
Каждый из этих пунктов добавляет по одной строчке. Запись класса в файл — Files.write(Paths.get(className+".class"), cw.toByteArray());
. Не, ну я согласен, что экономия пары строчек — тоже экономия. Просто взял привычный инструмент, который уже был под рукой. Скачивать и осваивать новый инструмент — тоже накладные расходы :-)
Статический анализ → уязвимость → профит