JDT 随记---介绍

因公司项目的需要,最近开始研究Eclipse JDT ,边研究边记录如下:

JDT(java development tooling)是Eclipse提供的一组API。其功能引用其官方文档上的说法:

  1. Programmatically manipulate Java resources, such as creating projects, generating Java source code, performing builds, or detecting problems in code.
  2. Programmatically launch a Java program from the platform.
  3. Provide a new type of VM launcher to support a new family of Java runtimes.
  4. Add new functions and extensions to the Java IDE itself.

总之,提供了一系列强大的API供我们操作Java代码。

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,eclipse,ide)