使用勺子在方法中生成 class

generating a class within a method with spoon

我一直在研究一种处理器,它可以在 class 内部 方法中注入一个方法,但我在弄清楚如何做到这一点时遇到了很多麻烦生成 class 和随附的对象初始化,而不会导致自动生成不正确的完全限定名称。

例如,我一直在处理如下内容: 我一直在制作新的 class:

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 是整体 class 的名称,所有内容都在其中,即使 internal 仅在特定方法内部声明。我试过对内部 classes 使用 getFactory().Class().create() 方法,但该方法似乎只针对嵌套在 classes 中的 classes =]es,与在方法中声明的 classes 相对。

我在 class 声明中做错了什么吗?我只是 运行 限制了 spoon 生成内部 classes 的能力吗?有什么建议吗?

谢谢大家!

一种可能的解决方案是在内部 class 名称前加上一个数字。

这个有用吗?

请毫不犹豫地使用 Github issues 报告奇怪的行为。

虽然有点 hack,但代码片段表达式允许手动覆盖涉及给定内部 class 的类型名称和构造函数调用的表达式。例如:

String constructorCallSnippet = 
    "new " + classType.toString() + "(" 
    + String.join(", ", args.stream().map(a -> a.toString()).collect(toList()))
    + ")";
CtExpression constructorCall =
    getFactory().Code().createCodeSnippetExpression(constructorCallSnippet);