Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用spoon在方法内生成类_Java_Inria Spoon - Fatal编程技术网

Java 使用spoon在方法内生成类

Java 使用spoon在方法内生成类,java,inria-spoon,Java,Inria Spoon,我一直在研究一个在方法中注入内部类的处理器,我很难弄清楚如何生成类和伴随的对象初始化,而不会自动生成不正确的完全限定名 例如,我一直在处理以下内容: 我一直在做一门新课: CtClass internal = getFactory().Core().createClass(); 然后将其插入方法中的元素之前 element.insertBefore(internal); 但当我做一个初始化语句时: CtConstructorCall call = getFactory().Core().cr

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

例如,我一直在处理以下内容: 我一直在做一门新课:

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

我的班级声明有什么问题吗?我是否只是在spoon生成内部类的能力上遇到了限制?有什么建议吗


谢谢大家

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

这行吗


不要犹豫,用它来报告奇怪的行为

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

这行吗


不要犹豫,用它来报告奇怪的行为

尽管这有点像黑客,但代码段表达式允许手动重写涉及给定内部类的类型名和构造函数调用的表达式。例如:

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

尽管这有点像黑客,但代码段表达式允许手动重写涉及给定内部类的类型名和构造函数调用的表达式。例如:

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

即使在内部类名前面加了一个数字,Spoon似乎也不喜欢在完全限定名和简单名相同的方法中生成本地类。据我所知,在方法的范围内创建命名类通常是不好的做法,但对于我的特定项目来说,这是必要的。幸运的是,只需使用代码片段表达式就可以生成包含内部类类型或构造函数调用的表达式,因此这似乎没什么大不了的。除此之外,Spoon在本例中的行为与其说是“奇怪”,倒不如说是缺少一个特性,但我注意到页面上的方法中缺乏对内部类的支持。即使在内部类名前面加上数字,Spoon似乎也不太喜欢在完全限定名和简单名相同的方法中生成本地类。据我所知,在方法的范围内创建命名类通常是不好的做法,但对于我的特定项目来说,这是必要的。幸运的是,只需使用代码片段表达式就可以生成包含内部类类型或构造函数调用的表达式,因此这似乎没什么大不了的。除此之外,Spoon在本例中的行为与其说是“奇怪”,倒不如说是缺少一个特性,但是我注意到页面上的方法中缺乏对内部类的支持。