<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 1,  comments - 25,  trackbacks - 0

    JDT實際上是將Java代碼構建成一個基于DOM結構的抽象語法樹AST(Abstract Syntax Tree )。代碼中的每個部分都對應一個ASTNode,許多的ASTNode就構成了這個抽象的語法樹。Java Class一般對應Compilation Unit node,該節點也是AST樹上的頂點。創建一個AST如下:

    java 代碼
    1. ASTParser parser = ASTParser.newParser(AST.JLS3);   
    2. parser.setSource("".toCharArray());   
    3. CompilationUnit unit = (CompilationUnit) parser.createAST(null);    
    4. unit.recordModifications();   
    5. AST ast = unit.getAST();   

    其中createAST,當parse需要較長時間時,可以采用createAST(new NullProgressMonitor()),否則直接傳null即可。

    recordModifications()用于記錄節點的變動,比如修改、刪除等,當需要對AST樹進行變動操作時,必須要預先調用這個方法。


    比較重要的是:一個AST樹上的所有節點必須都屬于該AST。不允許直接將其他AST樹上的節點添加該AST樹上。否則會拋出java.lang.IllegalArgumentException異常。須使用ASTNode.copySubtree(AST target, ASTNode node)返回一個目標樹的深度拷貝,才能進行添加操作。例如:

    java 代碼
    1. ASTParser parser = ASTParser.newParser(AST.JLS3);   
    2. parser.setSource("".toCharArray());   
    3. CompilationUnit targetRoot= (CompilationUnit) parser.createAST(null);    
    4. targetRoot.recordModifications();   
    5. parser.setSource("class T{}”".toCharArray());   
    6. CompilationUnit srcRoot= (CompilationUnit) parser.createAST(null);    
    7.   
    8. //這是非法操作,兩者的AST源不一樣   
    9. targetRoot.types().add(srcRoot.types().get(0));   
    10.   
    11. //這是合法操作   
    12. targetRoot.types().add(ASTNode.copySubtree(   
    13. targetRoot.getAST(), (ASTNode) srcRoot.types().get(0)));   
    14.   
    15. //這是合法操作   
    16. targetRoot.types().add(targetRoot.getAST().newTypeDeclaration());  


     

    現把一些 Java代碼生成對應的ASTNode方式列出來,供參考:

    List 1 生成Package
    // package astexplorer;
    
    java 代碼
     
    1. PackageDeclaration packageDeclaration = ast.newPackageDeclaration();  
    2. unit.setPackage(packageDeclaration);  
    3. packageDeclaration.setName(ast.newSimpleName("astexplorer")); 
    List 2 生成Import
    // import org.eclipse.swt.SWT;
    // import org.eclipse.swt.events.*;
    // import org.eclipse.swt.graphics.*;
    // import org.eclipse.swt.layout.*;
    // import org.eclipse.swt.widgets.*;
    java 代碼
     
    1. for (int i = 0; i < IMPORTS.length; ++i) {  
    2. ImportDeclaration importDeclaration = ast.newImportDeclaration();  
    3. importDeclaration.setName(ast.newName(getSimpleNames(IMPORTS[i])));  
    4. if (IMPORTS[i].indexOf("*") > 0)  
    5. importDeclaration.setOnDemand(true);  
    6. else  
    7. importDeclaration.setOnDemand(false);  
    8.   
    9. unit.imports().add(importDeclaration);  
    10. }  
    List 3 生成Class Declaration
    // public class SampleComposite extends Composite 
    java 代碼
     
    1. TypeDeclaration classType = ast.newTypeDeclaration();  
    2. classType.setInterface(false);  
    3. classType.setModifiers(Modifier.PUBLIC);  
    4. classType.setName(ast.newSimpleName("SampleComposite"));  
    5. classType.setSuperclass(ast.newSimpleName("Composite"));  
    6. unit.types().add(classType);  


    List 4 生成Constructor Declaration

    // public SampleComposite(Composite parent,int style){}
    java 代碼
     
    1. MethodDeclaration methodConstructor = ast.newMethodDeclaration();  
    2. methodConstructor.setConstructor(true);  
    3. methodConstructor.setModifiers(Modifier.PUBLIC);  
    4. methodConstructor.setName(ast.newSimpleName("SampleComposite"));  
    5. classType.bodyDeclarations().add(methodConstructor);  
    6.   
    7. // constructor parameters  
    8.   
    9. SingleVariableDeclaration variableDeclaration = ast.newSingleVariableDeclaration();  
    10. variableDeclaration.setModifiers(Modifier.NONE);  
    11. variableDeclaration.setType(ast.newSimpleType(ast.newSimpleName("Composite")));  
    12. variableDeclaration.setName(ast.newSimpleName("parent"));  
    13. methodConstructor.parameters().add(variableDeclaration);  
    14.   
    15. variableDeclaration = ast.newSingleVariableDeclaration();  
    16. variableDeclaration.setModifiers(Modifier.NONE);  
    17. variableDeclaration.setType(ast.newPrimitiveType(PrimitiveType.INT));  
    18. variableDeclaration.setName(ast.newSimpleName("style"));  
    19. methodConstructor.parameters().add(variableDeclaration);  
    20. Block constructorBlock = ast.newBlock();  
    21. methodConstructor.setBody(constructorBlock);
     List 5 生成Spuer Invocation

    // super(parent,style)
    java 代碼
     
    1. SuperConstructorInvocation superConstructorInvocation = ast.newSuperConstructorInvocation();  
    2. constructorBlock.statements().add(superConstructorInvocation);  
    3. Expression exp = ast.newSimpleName("parent");  
    4. superConstructorInvocation.arguments().add(exp);  
    5. superConstructorInvocation.arguments().add(ast.newSimpleName("style"));  

    List 6 生成ClassInstanceCreation

    // GridLayout gridLayout = new GridLayout();
    java 代碼
     
    1. VariableDeclarationFragment vdf = ast.newVariableDeclarationFragment();  
    2. vdf.setName(ast.newSimpleName("gridLayout"));  
    3. ClassInstanceCreation cc = ast.newClassInstanceCreation();  
    4. cc.setName(ast.newSimpleName("GridLayout"));  
    5. vdf.setInitializer(cc);  
    6. VariableDeclarationStatement vds = ast.newVariableDeclarationStatement(vdf);  
    7. vds.setType(ast.newSimpleType(ast.newSimpleName("GridLayout"))); 
    8. constructBlock.statements().add(vds);

    // Label label = new Label(this,SWT.NONE);
    java 代碼
     
    1. VariableDeclarationFragment vdf = ast.newVariableDeclarationFragment();  
    2. vdf.setName(ast.newSimpleName("label"));  
    3. cc = ast.newClassInstanceCreation();  
    4. cc.setName(ast.newSimpleName("Label"));  
    5. cc.arguments().add(ast.newThisExpression());  
    6. cc.arguments().add(ast.newName(getSimpleNames("SWT.NONE")));  
    7. vdf.setInitializer(cc); 
    8. VariableDeclarationStatement vds = ast.newVariableDeclarationStatement(vdf);  
    9. vds.setType(ast.newSimpleType(ast.newSimpleName("Label")));
    10. constructBlock.statements().add(vds);

    List 7生成MethodInvocation

    // setLayout(gridLayout);
    java 代碼
     
    1. MethodInvocation mi = ast.newMethodInvocation();  
    2. mi.setName(ast.newSimpleName("setLayout"));  
    3. mi.arguments().add(ast.newSimpleName("gridLayout")); 
    4. constructorBlock.statements().add(ast.newExpressionStatement(mi));
    // label.setText("Press the button to close:");
             java 代碼
    1. mi = ast.newMethodInvocation();   
    2. mi.setExpression(ast.newSimpleName("label"));   
    3. mi.setName(ast.newSimpleName("setText"));   
    4. StringLiteral sl = ast.newStringLiteral();   
    5. sl.setLiteralValue("Press the button to close:");   
    6. mi.arguments().add(sl);   
    7. constructorBlock.statements().add(ast.newExpressionStatement(mi));  
    // label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER));
               java 代碼
    
    1. mi = ast.newMethodInvocation();   
    2. mi.setExpression(ast.newSimpleName("label"));   
    3. mi.setName(ast.newSimpleName("setLayoutData"));   
    4.   
    5. cc = ast.newClassInstanceCreation();   
    6. cc.setName(ast.newSimpleName("GridData"));   
    7. cc.arguments().add(ast.newName(getSimpleNames("GridData.HORIZONTAL_ALIGN_CENTER")));   
    8. mi.arguments().add(cc);   
    9. constructorBlock.statements().add(ast.newExpressionStatement(mi));  

     // Button button = new Button(this,SWT.PUSH);

    java 代碼
    1. vdf = ast.newVariableDeclarationFragment();   
    2. vdf.setName(ast.newSimpleName("button"));   
    3. vds = ast.newVariableDeclarationStatement(vdf);   
    4. vds.setType(ast.newSimpleType(ast.newSimpleName("Button")));   
    5. constructorBlock.statements().add(vds);   
    6.   
    7. cc = ast.newClassInstanceCreation();   
    8. cc.setName(ast.newSimpleName("Button"));   
    9. vdf.setInitializer(cc);   
    10. cc.arguments().add(ast.newThisExpression());   
    11. cc.arguments().add(ast.newName(getSimpleNames("SWT.PUSH")));  

    // button.addSelectionListener(new SelectionAdapter() {});

        java 代碼

    1. mi = ast.newMethodInvocation();   
    2. constructorBlock.statements().add(ast.newExpressionStatement(mi));   
    3. mi.setExpression(ast.newSimpleName("button"));   
    4. mi.setName(ast.newSimpleName("addSelectionListener"));   
    5.   
    6. ClassInstanceCreation ci = ast.newClassInstanceCreation();   
    7. ci.setName(ast.newSimpleName("SelectionAdapter"));   
    8. mi.arguments().add(ci);   
    9. AnonymousClassDeclaration cd = ast.newAnonymousClassDeclaration();   
    10. ci.setAnonymousClassDeclaration(cd); 






















    // public void setup(){super.setUp()}
        1. MethodDeclaration methodConstructor = ast.newMethodDeclaration();
                  methodConstructor.modifiers().add(
                          ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD));
                  methodConstructor.setName(ast.newSimpleName("setUp"));
    1.         Block constructorBlock = ast.newBlock();
              methodConstructor.setBody(constructorBlock);
    2.         SuperMethodInvocation smi = ast.newSuperMethodInvocation();
              smi.setName(ast.newSimpleName("setUp"));
              ExpressionStatement es = ast.newExpressionStatement(smi);
              constructorBlock.statements().add(es);
    3.         // set exception
              List targetExNames = methodConstructor.thrownExceptions();
              Name targetExName = ast.newName(Exception.class.getName());
              targetExNames.add(targetExName);
    4.         methodConstructor.setJavadoc(JavaDocHelper.getJavaDoc(ast,
                      JavaDocHelper.setUpDoc, null, null));
              classType.bodyDeclarations().add(methodConstructor);
    posted on 2008-07-14 13:21 Daniel 閱讀(323) 評論(0)  編輯  收藏 所屬分類: Eclipse的相關
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(3)

    隨筆檔案

    文章分類

    文章檔案

    相冊

    搜索

    •  

    最新評論

    主站蜘蛛池模板: 中文在线观看永久免费| 亚洲AV噜噜一区二区三区| 国产线视频精品免费观看视频| 国产午夜免费秋霞影院| 亚洲国产欧美日韩精品一区二区三区| 91老湿机福利免费体验| 久久亚洲AV成人无码国产| 亚洲黄色免费在线观看| 亚洲妇女水蜜桃av网网站| 日韩亚洲国产高清免费视频| 亚洲精品国产国语| 日本免费无遮挡吸乳视频电影| 亚洲AV日韩AV无码污污网站| 免费a级毛片网站| 91福利免费网站在线观看| 亚洲国产日韩一区高清在线| 亚洲高清免费在线观看| 亚洲国产欧洲综合997久久| 亚洲精品国产电影| 8x成人永久免费视频| 亚洲六月丁香婷婷综合| 国产a级特黄的片子视频免费| free哆拍拍免费永久视频| 日韩亚洲人成在线综合日本| 真人做A免费观看| 国产综合成人亚洲区| 亚洲精品无码久久一线| 97碰公开在线观看免费视频| 老司机亚洲精品影院在线观看| 国产成人精品久久亚洲高清不卡 | 三级黄色免费观看| 国产成人亚洲精品| 久99精品视频在线观看婷亚洲片国产一区一级在线 | 亚洲videosbestsex日本| 国产一区二区三区免费看| 男女午夜24式免费视频| 亚洲中文无码线在线观看| 亚洲AV无码乱码在线观看| 久久青草免费91线频观看站街| 亚洲国产AV无码一区二区三区| 亚洲色无码专区在线观看|