我一直在开发一个处理器,该处理器在方法内部注入一个内部类,我很难弄清楚如何在不自动生成不正确的完全限定名称的情况下生成该类和伴随的对象初始化。
例如,我一直在处理以下内容:我一直在制作一个新课程:
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()方法,但该方法似乎只针对嵌套在类中的类,而不是在方法中delcare的类。
我是不是在课堂申报上做错了什么?我只是遇到了勺子生成内部类的能力的限制吗?有什么建议吗?
谢谢大家!
一种可能的解决方案是在内部类名前面加一个数字。
这行得通吗?
不要犹豫,使用Github问题来报告奇怪的行为。
尽管这有点像黑客,但代码片段表达式允许手动重写涉及给定内部类的类型名和构造函数调用的表达式。例如:
String constructorCallSnippet =
"new " + classType.toString() + "("
+ String.join(", ", args.stream().map(a -> a.toString()).collect(toList()))
+ ")";
CtExpression constructorCall =
getFactory().Code().createCodeSnippetExpression(constructorCallSnippet);