使用JavaParser进行java源码解析
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源码解析相关推荐
- String为什么不可变?(Java源码解析)
String的源码解析 public final class String{private final char value[];//容器,存放字符串的private int hash;//哈希值pr ...
- Java源码解析库对比:javaparser、qdox、spoon
Qdox:paul-hammant/qdox JavaParser:javaparser/javaparser SPOON:INRIA/spoon Qdox JavaParser SPOON GitH ...
- 微软OA认证/ADFS认证 java 源码解析
依照项目的需要,客户需要使用微软的认证,仔细走了一遍官方的源码,希望可以给后来人 指条路 1.先去微软的官网下载java版本的源代码 下载地址 上面的下载页面 会有一套具体的申请账号+配置流程 ,跟着 ...
- FingerPrint:go转java源码解析
需求: 对数据库做一个哈希压缩吧,用数字指纹 看看go源码: package mainimport ("fmt" )type Label struct {Name string ` ...
- Java源码解析:深入理解==和equals()
1.结论 1.1 == 1.所有原始数据类型,比较的是值 2.所有的对象比较的是内存地址 注意点:Integer类有对象池[-128,127] 1.2 equals()方法 1.未重写的equals( ...
- Java源码解析:hashCode与相同对象的关系
1.普通类对象 1. hashCode相同,不一定是同一个对象 2. 同一个对象的,hashCode值一定相同 2. 数值型的原始数据类型对应的包装类 只要值是一样的,hashCode就会是相同的.尽 ...
- Java源码解析——Java IO包
一.基础知识: 1. Java IO一般包含两个部分:1)java.io包中阻塞型IO:2)java.nio包中的非阻塞型IO,通常称为New IO.这里只考虑到java.io包中堵塞型IO: 2. ...
- java解析java源码_JAVA语言-Java源码解析-Stack源码分析
一.简介 stack类图.png 栈是数据结构中一种很重要的数据结构类型,因为栈的后进先出功能是实际的开发中有很多的应用场景.Java API中提供了栈(Stacck)的实现.Stack类继承了Vec ...
- 【Java源码解析】如何严谨地重写 equals 方法、getClass 方法与 instanceof 关键词用法比较
文章目录 如何严谨地重写 equals 方法 1 equals 方法概述 2 String 类中的 equals 方法 3 自定义 equals 方法时出现的问题 4 instanceof 关键词与 ...
- java源码解析之反射(二)
依赖的结构图: 查看全文 http://www.taodudu.cc/news/show-2970933.html 相关文章: js基础 宿主环境 [笔记]实战mpvue2.0多端小程序框架--原生小 ...
最新文章
- 官宣!邢波出任全球首个AI大学校长,MBZUAI明年1月迎来首批新生
- Spring框架学习day_01: 框架配置方式/ 管理对象的作用域/ 生命周期/ 组件扫描/ 单例模式:“懒汉式“,“饿汉式“
- java ssh连接 如何不使用密码_如何在java中为ssh连接设置密码
- npm ERR! Unexpected end of JSON input while parsing near '...on:0.10.3,direc to'
- tr的display属性出现td的colspan无效问题
- 通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的脾气秉性(二)
- FinalTest 基于web的登录口令修改设计
- 利用寄存器进入栈值交换
- macOS Big Sur应用图标替换教程︳big sur图标包
- showcase basketball stadium
- Android中MediaRecorder.stop()报错 java.lang.RuntimeException: stop failed.
- 如何清洗 Git Repo 代码仓库
- 华为云linux用户名,玩转华为云服务器ECS:001 如何登录并创建新用户
- mysql5.0优势_mysql5.0.1提供视图功能其优势
- python3--列表生成式
- ae效果英文版翻译对照表_AE菜单中英文对照表 (超全)
- CATIA V6二次开发——复杂装配体的结构树遍历
- 软件项目管理第四章笔记---项目时间管理
- tf.minimum
- 函数周期表丨筛选丨值丨CALCULATE
热门文章
- 同一进程不同线程之间的资源共享与独享
- LVS基本介绍及NAT模型配置示例
- C#对MySql进行增删该查
- cntrol层的代码作用
- Nginx源码分析 - HTTP模块篇 - HTTP Request解析过程(22)
- 数组 -- 3Sum Closet -- 图解
- mysql视图可以完成的操作_MySQL视图操作
- 如何计算给定一个unigram语言模型_数位语音处理Lesson3-初识前端信号处理、语言模型...
- java.lang.ArrayStoreException 已解决 byte[]数组拷贝问题
- 【渝粤教育】国家开放大学2018年秋季 0179-21T数据库基础与应用 参考试题