使用jdt ast设置修饰符(public final static)

时间:2018-01-24 09:37:53

标签: java abstract-syntax-tree access-modifiers eclipse-jdt

。我试图从0写一个只使用常量使用jdt的类。当我尝试将修饰符设置为字段声明时出现错误

错误:线程“main”中的异常java.lang.UnsupportedOperationException:仅在JLS2 AST中支持操作。

我尝试的代码

public static void createConstantClasses () throws MalformedTreeException, BadLocationException, org.eclipse.jface.text.BadLocationException{
        //todosLiterales();
        List<String> lista = getPackages();
        String filename;
        for(int i = 0;i< lista.size();i++){
            AST ast = AST.newAST(AST.JLS3);
            CompilationUnit cu = ast.newCompilationUnit();
            PackageDeclaration p1 = ast.newPackageDeclaration();
            p1.setName(ast.newSimpleName("constante"));
            cu.setPackage(p1);
            TypeDeclaration td = ast.newTypeDeclaration();

            if(lista.get(i).lastIndexOf('.')>=0){
                filename="Constant"+lista.get(i).substring(lista.get(i).lastIndexOf('.')+1
                        , lista.get(i).lastIndexOf(';'));
            td.setName(ast.newSimpleName(filename));
            }else{
                filename="Constant"+lista.get(i).substring(8
                        , lista.get(i).lastIndexOf(';'));
                td.setName(ast.newSimpleName(filename));

            }

            for(int j =0;j<getVisitadores().size();j++ ){
                if(getVisitadores().get(j).packageori.compareTo(lista.get(i))==0){
                    int listasize=getVisitadores().get(j).getListaStringliterales().size();
                    for(int k=0; k<listasize;k++){

                        ModifierKeyword keyword = null;
                        Modifier modifi =ast.newModifier(keyword.FINAL_KEYWORD);

                        Type tipo = ast.newSimpleType(ast.newSimpleName("String"));


                        VariableDeclarationFragment fragment = ast.newVariableDeclarationFragment();
                        System.out.println(getVisitadores().get(j).listaStringliterales.get(k).nombreVar);
                        fragment.setName(ast.newSimpleName(getVisitadores().get(j).listaStringliterales.get(k).nombreVar));



                        StringLiteral ini = ast.newStringLiteral();
                        ini.setLiteralValue((String) getVisitadores().get(j).listaStringliterales.get(k).value);
                        fragment.setInitializer(ini);
                        FieldDeclaration campo =ast.newFieldDeclaration(fragment);
                        campo.setModifiers(48);
                        campo.setType(tipo);
                        //campo.setProperty("public", Modifier.PUBLIC);
                        //campo.setModifiers(modifi);
                        td.bodyDeclarations().add(campo);


                        System.out.println(td.bodyDeclarations());  
                        }//final de bucle 


                }//final del if 





                    //System.out.println(cu);   

                }cu.types().add(td);//final 2 bucle
                //cu.types().add(td);
                System.out.println(cu.toString());
                System.out.println(cu);
                Document documento = new Document (cu.toString());
                escribirArchivo(filename+".java",documento);

            }


        }`

当我玩它时我得到的是这样的

package constante;
class Constantcore {
  String StringCTMain0="soy el original ";
  String StringCTMain1="SOME.FUCKINF.PATH";
  String StringCTMain2="\\.";
  String StringCTMain3="JAVA.UTIL.BBVa";
  String StringCTMain4="es el visitador ";
  String StringCTMain5="y tiene ";
  String StringCTMain6="literales";
  String StringCTMain7="vistador ";
  String StringCTMain8=" litereal ";
  String StringCTMain9="constante";
  String StringCTMain10="Constant";
  String StringCTMain11="String";
  String StringCTMain12=".java";
  String StringCTMain13=".";
  String StringCTMain14="src";
  String StringCTMain15="IOException";
  String StringCTVisitador0="default";
  String StringCTVisitador1="paquete original en el visistador ";
  String StringCTVisitador2="meanwhile at visitmethod ";
  String StringCTVisitador3="StringCT";
  String StringCTVisitador4="IOException";
}

我期望实现的是这样的

package constante;
class Constantcore {
  public final static String StringCTMain0="soy el original ";
  public final static String StringCTMain1="SOME.FUCKINF.PATH";
  public final static String StringCTMain2="\\.";
  public final static String StringCTMain3="JAVA.UTIL.BBVa";
  public final static String StringCTMain4="es el visitador ";
  public final static String StringCTMain5="y tiene ";
  public final static String StringCTMain6="literales";
  public final static String StringCTMain7="vistador ";
  public final static String StringCTMain8=" litereal ";
  public final static String StringCTMain9="constante";
  public final static String StringCTMain10="Constant";
  public final static String StringCTMain11="String";
  public final static String StringCTMain12=".java";
  public final static String StringCTMain13=".";
  public final static String StringCTMain14="src";
  public final static String StringCTMain15="IOException";
  public final static String StringCTVisitador0="default";
  public final static String StringCTVisitador1="paquete original en el visistador ";
 public final static String StringCTVisitador2="meanwhile at visitmethod ";
  public final static String StringCTVisitador3="StringCT";
 public final static String StringCTVisitador4="IOException";
}
有人能帮忙吗? thx提前

已解决:需要更改此行

 campo.setModifiers(48);

为此并重复我们想要添加的每个修饰符

    ModifierKeyword amp= ModifierKeyword.PUBLIC_KEYWORD;
 campo.modifiers().add(ast.newModifier(amp));

0 个答案:

没有答案