使用 JavaParser 将 String 字段添加到新的 compilationUnit
Adding a String field to a new compilationUnit with JavaParser
这可能是一个愚蠢的问题,但我想了解主题的内容。我想将一个新的 String 字段添加到一个新的新 compilationUnit 中新声明的 classOrInterface 对象。但据我从源文件中可以看出,该选项是不可能的。 primitiveClass 仅包含所有其他基元、Long、char、bytes 等的枚举。
我错过了什么吗?还是开发人员忘记了 String 选项?
已解决
感谢 Riduidels 的回答,我设法破解了代码,可以这么说 :) 事情是创建一个新的 ClassOrInterfaceType 并将其命名为 String,非常简单。不过,我必须说,JavaParser 背后的人应该考虑为 String 添加一个枚举,就像他们为其他 Primitives 所做的那样。工作代码:
public static void main(String[] args){
// TODO Auto-generated method stub
// creates the compilation unit
CompilationUnit cu = createCU();
// prints the created compilation unit
System.out.println(cu.toString());
}
/**
* creates the compilation unit
*/
private static CompilationUnit createCU() {
CompilationUnit cu = new CompilationUnit();
// set the package
cu.setPackage(new PackageDeclaration(ASTHelper.createNameExpr("java.parser.test")));
// create the type declaration
ClassOrInterfaceDeclaration type = new ClassOrInterfaceDeclaration(ModifierSet.PUBLIC, false, "GeneratedClass");
ASTHelper.addTypeDeclaration(cu, type); // create a field
FieldDeclaration field = ASTHelper.createFieldDeclaration(ModifierSet.PUBLIC, new ClassOrInterfaceType("String"),"test");
ASTHelper.addMember(type, field);
return cu;
}
谢谢 Riduidel!
嗯,这很正常:Java解析器类型层次结构非常接近 Java 源文件中的层次结构。在源文件中,您不会将字符串直接放在文件中,而是放在文件中声明的 class 中。
这在Java解析器部分Creating a CompilationUnit from scratch中有很好的描述,可以添加哪些内容成为
public class ClassCreator {
public static void main(String[] args) throws Exception {
// creates the compilation unit
CompilationUnit cu = createCU();
// prints the created compilation unit
System.out.println(cu.toString());
}
/**
* creates the compilation unit
*/
private static CompilationUnit createCU() {
CompilationUnit cu = new CompilationUnit();
// set the package
cu.setPackage(new PackageDeclaration(ASTHelper.createNameExpr("java.parser.test")));
// create the type declaration
ClassOrInterfaceDeclaration type = new ClassOrInterfaceDeclaration(ModifierSet.PUBLIC, false, "GeneratedClass");
ASTHelper.addTypeDeclaration(cu, type);
// create a field
FieldDeclaration field = new FieldDeclaration(ModifierSet.PUBLIC, new ClassOrInterface(String.class.getName()), new VariableDeclarator(new VariableDeclaratorId("variableName")))
ASTHelper.addMember(type, field);
return cu;
}
}
这将在包 java.parser.test
中创建一个包含名为 GeneratedClass
的 class 的文件,其中包含一个名为 GeneratedClass
的简单字段(尽管我没有编译上面的内容代码以确保其正确性)。
这可能是一个愚蠢的问题,但我想了解主题的内容。我想将一个新的 String 字段添加到一个新的新 compilationUnit 中新声明的 classOrInterface 对象。但据我从源文件中可以看出,该选项是不可能的。 primitiveClass 仅包含所有其他基元、Long、char、bytes 等的枚举。
我错过了什么吗?还是开发人员忘记了 String 选项?
已解决 感谢 Riduidels 的回答,我设法破解了代码,可以这么说 :) 事情是创建一个新的 ClassOrInterfaceType 并将其命名为 String,非常简单。不过,我必须说,JavaParser 背后的人应该考虑为 String 添加一个枚举,就像他们为其他 Primitives 所做的那样。工作代码:
public static void main(String[] args){
// TODO Auto-generated method stub
// creates the compilation unit
CompilationUnit cu = createCU();
// prints the created compilation unit
System.out.println(cu.toString());
}
/**
* creates the compilation unit
*/
private static CompilationUnit createCU() {
CompilationUnit cu = new CompilationUnit();
// set the package
cu.setPackage(new PackageDeclaration(ASTHelper.createNameExpr("java.parser.test")));
// create the type declaration
ClassOrInterfaceDeclaration type = new ClassOrInterfaceDeclaration(ModifierSet.PUBLIC, false, "GeneratedClass");
ASTHelper.addTypeDeclaration(cu, type); // create a field
FieldDeclaration field = ASTHelper.createFieldDeclaration(ModifierSet.PUBLIC, new ClassOrInterfaceType("String"),"test");
ASTHelper.addMember(type, field);
return cu;
}
谢谢 Riduidel!
嗯,这很正常:Java解析器类型层次结构非常接近 Java 源文件中的层次结构。在源文件中,您不会将字符串直接放在文件中,而是放在文件中声明的 class 中。
这在Java解析器部分Creating a CompilationUnit from scratch中有很好的描述,可以添加哪些内容成为
public class ClassCreator {
public static void main(String[] args) throws Exception {
// creates the compilation unit
CompilationUnit cu = createCU();
// prints the created compilation unit
System.out.println(cu.toString());
}
/**
* creates the compilation unit
*/
private static CompilationUnit createCU() {
CompilationUnit cu = new CompilationUnit();
// set the package
cu.setPackage(new PackageDeclaration(ASTHelper.createNameExpr("java.parser.test")));
// create the type declaration
ClassOrInterfaceDeclaration type = new ClassOrInterfaceDeclaration(ModifierSet.PUBLIC, false, "GeneratedClass");
ASTHelper.addTypeDeclaration(cu, type);
// create a field
FieldDeclaration field = new FieldDeclaration(ModifierSet.PUBLIC, new ClassOrInterface(String.class.getName()), new VariableDeclarator(new VariableDeclaratorId("variableName")))
ASTHelper.addMember(type, field);
return cu;
}
}
这将在包 java.parser.test
中创建一个包含名为 GeneratedClass
的 class 的文件,其中包含一个名为 GeneratedClass
的简单字段(尽管我没有编译上面的内容代码以确保其正确性)。