Создание класса в методе с ложкой
Я работал над процессором, который внедряет внутренний класс внутри метода, и у меня много проблем с выяснением того, как генерировать класс и инициализацию сопутствующего объекта без автоматической генерации неправильного полностью квалифицированного имени,
Например, я обрабатывал такие вещи, как: я делал новый класс:
CtClass internal = getFactory().Core().createClass();
а затем вставив его перед элементом в методе
element.insertBefore(internal);
но когда я делаю заявление об инициализации:
CtConstructorCall call = getFactory().Core().createConstructorCall();
call.setType(internal);
internal.insertAfter(call);
Я получаю звонок, который выглядит так:
Main.internal initializedInternalObject = new Main.internal();
куда Main
это имя всего класса, внутри которого есть все, даже если internal
объявляется только внутри определенного метода. Я пытался использовать метод getFactory().Class(). Create() для внутренних классов, но этот метод, похоже, предназначен только для классов, вложенных в классы, а не для классов, разделенных внутри методов.
Я делаю что-то не так с объявлением класса? Я просто сталкиваюсь с ограничением способности ложки генерировать внутренние классы? Какие-либо предложения?
Спасибо всем!
2 ответа
Одним из возможных решений является префикс внутреннего имени класса цифрой.
Это работает?
Не стесняйтесь использовать проблемы Github для сообщения о странном поведении.
Хотя это и является своего рода хаком, выражения фрагмента кода допускают ручное переопределение выражений, включающих вызовы имени типа и конструктора данного внутреннего класса. Например:
String constructorCallSnippet =
"new " + classType.toString() + "("
+ String.join(", ", args.stream().map(a -> a.toString()).collect(toList()))
+ ")";
CtExpression constructorCall =
getFactory().Code().createCodeSnippetExpression(constructorCallSnippet);