JavaParser下载地址:http://code.google.com/p/javaparser/downloads/list

刚开始接触的时候觉得和JDT里的Parser类不太一样。查了一下WiKi,发现它访问编译单元成员,需要调用相应子元素对应的Visitor类的visit()方法。此方法可以通过复写来实现自己需要的功能。我需要的功能是将编译单元里的所有MethodDeclaration取出,因此利用传递句柄的方式,实现代码如下:

 1 public static List<MethodDeclaration> getMethodList(CompilationUnit cu) {
 2         List<MethodDeclaration> methodList = new ArrayList<MethodDeclaration>();
 3         new MethodGetterVisitor().visit(cu, methodList);
 4
 5         return methodList;
 6     }
 7
 8     private static class MethodGetterVisitor extends VoidVisitorAdapter<Object> {
 9
10         @SuppressWarnings("unchecked")
11         @Override
12         public void visit(MethodDeclaration n, Object arg) {
13             List<MethodDeclaration> methodList = new ArrayList<MethodDeclaration>();
14             methodList =  (List<MethodDeclaration>) arg;
15             methodList.add(n);
16         }
17     }

官方还提供了不通过Visitor改变一个类成员方法的示例(相对Visitor更复杂):

 1 public class MethodChanger {
 2
 3     public static void main(String[] args) throws Exception {
 4         // creates an input stream for the file to be parsed
 5         FileInputStream in = new FileInputStream("test.java");
 6
 7         CompilationUnit cu;
 8         try {
 9             // parse the file
10             cu = JavaParser.parse(in);
11         } finally {
12             in.close();
13         }
14
15         // change the methods names and parameters
16         changeMethods(cu);
17
18         // prints the changed compilation unit
19         System.out.println(cu.toString());
20     }
21
22     private static void changeMethods(CompilationUnit cu) {
23         List<TypeDeclaration> types = cu.getTypes();
24         for (TypeDeclaration type : types) {
25             List<BodyDeclaration> members = type.getMembers();
26             for (BodyDeclaration member : members) {
27                 if (member instanceof MethodDeclaration) {
28                     MethodDeclaration method = (MethodDeclaration) member;
29                     changeMethod(method);
30                 }
31             }
32         }
33     }
34
35     private static void changeMethod(MethodDeclaration n) {
36         // change the name of the method to upper case
37         n.setName(n.getName().toUpperCase());
38
39         // create the new parameter
40         Parameter newArg = ASTHelper.createParameter(ASTHelper.INT_TYPE, "value");
41
42         // add the parameter to the method
43         ASTHelper.addParameter(n, newArg);
44     }
45 }

最后附上WiKi里给出的编译单元创建示例:

 1 public class ClassCreator {
 2
 3     public static void main(String[] args) throws Exception {
 4         // creates the compilation unit
 5         CompilationUnit cu = createCU();
 6
 7         // prints the created compilation unit
 8         System.out.println(cu.toString());
 9     }
10
11     /**
12      * creates the compilation unit
13      */
14     private static CompilationUnit createCU() {
15         CompilationUnit cu = new CompilationUnit();
16         // set the package
17         cu.setPakage(new PackageDeclaration(ASTHelper.createNameExpr("java.parser.test")));
18
19         // create the type declaration
20         ClassOrInterfaceDeclaration type = new ClassOrInterfaceDeclaration(ModifierSet.PUBLIC, false, "GeneratedClass");
21         ASTHelper.addTypeDeclaration(cu, type);
22
23         // create a method
24         MethodDeclaration method = new MethodDeclaration(ModifierSet.PUBLIC, ASTHelper.VOID_TYPE, "main");
25         method.setModifiers(ModifierSet.addModifier(method.getModifiers(), ModifierSet.STATIC));
26         ASTHelper.addMember(type, method);
27
28         // add a parameter to the method
29         Parameter param = ASTHelper.createParameter(ASTHelper.createReferenceType("String", 0), "args");
30         param.setVarArgs(true);
31         ASTHelper.addParameter(method, param);
32
33         // add a body to the method
34         BlockStmt block = new BlockStmt();
35         method.setBody(block);
36
37         // add a statement do the method body
38         NameExpr clazz = new NameExpr("System");
39         FieldAccessExpr field = new FieldAccessExpr(clazz, "out");
40         MethodCallExpr call = new MethodCallExpr(field, "println");
41         ASTHelper.addArgument(call, new StringLiteralExpr("Hello World!"));
42         ASTHelper.addStmt(block, call);
43
44         return cu;
45     }
46 }

转载于:https://www.cnblogs.com/tajnice/p/3543813.html

使用JavaParser进行java源码解析相关推荐

  1. String为什么不可变?(Java源码解析)

    String的源码解析 public final class String{private final char value[];//容器,存放字符串的private int hash;//哈希值pr ...

  2. Java源码解析库对比:javaparser、qdox、spoon

    Qdox:paul-hammant/qdox JavaParser:javaparser/javaparser SPOON:INRIA/spoon Qdox JavaParser SPOON GitH ...

  3. 微软OA认证/ADFS认证 java 源码解析

    依照项目的需要,客户需要使用微软的认证,仔细走了一遍官方的源码,希望可以给后来人 指条路 1.先去微软的官网下载java版本的源代码 下载地址 上面的下载页面 会有一套具体的申请账号+配置流程 ,跟着 ...

  4. FingerPrint:go转java源码解析

    需求: 对数据库做一个哈希压缩吧,用数字指纹 看看go源码: package mainimport ("fmt" )type Label struct {Name string ` ...

  5. Java源码解析:深入理解==和equals()

    1.结论 1.1 == 1.所有原始数据类型,比较的是值 2.所有的对象比较的是内存地址 注意点:Integer类有对象池[-128,127] 1.2 equals()方法 1.未重写的equals( ...

  6. Java源码解析:hashCode与相同对象的关系

    1.普通类对象 1. hashCode相同,不一定是同一个对象 2. 同一个对象的,hashCode值一定相同 2. 数值型的原始数据类型对应的包装类 只要值是一样的,hashCode就会是相同的.尽 ...

  7. Java源码解析——Java IO包

    一.基础知识: 1. Java IO一般包含两个部分:1)java.io包中阻塞型IO:2)java.nio包中的非阻塞型IO,通常称为New IO.这里只考虑到java.io包中堵塞型IO: 2. ...

  8. java解析java源码_JAVA语言-Java源码解析-Stack源码分析

    一.简介 stack类图.png 栈是数据结构中一种很重要的数据结构类型,因为栈的后进先出功能是实际的开发中有很多的应用场景.Java API中提供了栈(Stacck)的实现.Stack类继承了Vec ...

  9. 【Java源码解析】如何严谨地重写 equals 方法、getClass 方法与 instanceof 关键词用法比较

    文章目录 如何严谨地重写 equals 方法 1 equals 方法概述 2 String 类中的 equals 方法 3 自定义 equals 方法时出现的问题 4 instanceof 关键词与 ...

  10. java源码解析之反射(二)

    依赖的结构图: 查看全文 http://www.taodudu.cc/news/show-2970933.html 相关文章: js基础 宿主环境 [笔记]实战mpvue2.0多端小程序框架--原生小 ...

最新文章

  1. 官宣!邢波出任全球首个AI大学校长,MBZUAI明年1月迎来首批新生
  2. Spring框架学习day_01: 框架配置方式/ 管理对象的作用域/ 生命周期/ 组件扫描/ 单例模式:“懒汉式“,“饿汉式“
  3. java ssh连接 如何不使用密码_如何在java中为ssh连接设置密码
  4. npm ERR! Unexpected end of JSON input while parsing near '...on:0.10.3,direc to'
  5. tr的display属性出现td的colspan无效问题
  6. 通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的脾气秉性(二)
  7. FinalTest 基于web的登录口令修改设计
  8. 利用寄存器进入栈值交换
  9. macOS Big Sur应用图标替换教程︳big sur图标包
  10. showcase basketball stadium
  11. Android中MediaRecorder.stop()报错 java.lang.RuntimeException: stop failed.
  12. 如何清洗 Git Repo 代码仓库
  13. 华为云linux用户名,玩转华为云服务器ECS:001 如何登录并创建新用户
  14. mysql5.0优势_mysql5.0.1提供视图功能其优势
  15. python3--列表生成式
  16. ae效果英文版翻译对照表_AE菜单中英文对照表 (超全)
  17. CATIA V6二次开发——复杂装配体的结构树遍历
  18. 软件项目管理第四章笔记---项目时间管理
  19. tf.minimum
  20. 函数周期表丨筛选丨值丨CALCULATE

热门文章

  1. 同一进程不同线程之间的资源共享与独享
  2. LVS基本介绍及NAT模型配置示例
  3. C#对MySql进行增删该查
  4. cntrol层的代码作用
  5. Nginx源码分析 - HTTP模块篇 - HTTP Request解析过程(22)
  6. 数组 -- 3Sum Closet -- 图解
  7. mysql视图可以完成的操作_MySQL视图操作
  8. 如何计算给定一个unigram语言模型_数位语音处理Lesson3-初识前端信号处理、语言模型...
  9. java.lang.ArrayStoreException 已解决 byte[]数组拷贝问题
  10. 【渝粤教育】国家开放大学2018年秋季 0179-21T数据库基础与应用 参考试题