【问题标题】:generating a class within a method with spoon用勺子在方法中生成一个类
【发布时间】:2016-08-15 11:56:44
【问题描述】:

我一直在研究一个将内部类inside注入方法的处理器,但我在弄清楚如何生成类和伴随的对象初始化而不引起自动生成不正确的完全限定名称。

例如,我一直在处理以下内容: 我一直在开设一个新课程:

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() 方法,但该方法似乎只针对嵌套在类中的类,而不是在方法中定义的类。

我的类声明有问题吗?我只是遇到了勺子生成内部类的能力的限制吗?有什么建议吗?

谢谢大家!

【问题讨论】:

    标签: java inria-spoon


    【解决方案1】:

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

    这行得通吗?

    不要犹豫,使用Github issues 报告奇怪的行为。

    【讨论】:

    • 即使在内部类名前面加上一个数字后,Spoon 似乎也不喜欢在 within 一个完全限定名称和简单的方法中生成本地类名称将相同。据我所知,无论如何在方法范围内创建命名类通常是不好的做法,但对于我的特定项目来说,这是必要的。不过幸运的是,只使用代码 sn-p 表达式来生成涉及内部类类型或构造函数调用的表达式非常简单,所以看起来没什么大不了的。
    • 顺便说一句,在这种情况下,Spoon 的行为似乎并不“奇怪”,而是缺少一个功能,但我已经注意到在方法中缺乏对内部类的支持issues 页面。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-04
      • 1970-01-01
      • 2020-02-14
      • 2011-10-23
      • 1970-01-01
      • 1970-01-01
      • 2023-01-19
      相关资源
      最近更新 更多