`
jilen
  • 浏览: 97648 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

使用openjdk的语法解析器(Parser)解析java源代码

    博客分类:
  • java
阅读更多

    jsr269提供annotation processor,允许我们在编译器编译过程中挂钩子。http://projectlombok.org/ 的许多功能正是基于此实现。

    但有时候可能需要解析语法正确,但没有语义的Java文件(比如对工程中的单个java源文件的方法等元素建索引),这个时候jsr269就不能满足需求了。此时,我们只要语法树(ast)就可以了,也就是说不需要编译通过,只需要语法解析,可选的parser我找到了3个:

 

-- antlr parser

-- eclipse jdt parser

-- javac parser

 

下面一个例子使用javac parser来获得ast,并采用visitor模式遍历整颗语法树,提取文件中的所有方法。

注意:

     需要在classpath中引入jdk的tools.jar

     很多类不属于标准api,目前只在openjdk6,7上做过测试

 

package org.jilen;

import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileChannel.MapMode;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

import com.sun.source.tree.MethodTree;
import com.sun.source.util.TreeScanner;
import com.sun.tools.javac.file.JavacFileManager;
import com.sun.tools.javac.parser.Parser;
import com.sun.tools.javac.parser.ParserFactory;
import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
import com.sun.tools.javac.util.Context;

public class JDKParser {
	private ParserFactory factory;

	public JDKParser() {
		factory = getParserFactory();
	}

	public List<String> parseMethodDefs(String file) throws IOException {
		JCCompilationUnit unit = parse(file);
		MethodScanner scanner = new MethodScanner();
		return scanner.visitCompilationUnit(unit, new ArrayList<String>());

	}

	JCCompilationUnit parse(String file) throws IOException {
		Parser parser = factory.newParser(readFile(file), true, false, true);
		return parser.parseCompilationUnit();
	}

	private ParserFactory getParserFactory() {
		Context context = new Context();
		JavacFileManager.preRegister(context);
		ParserFactory factory = ParserFactory.instance(context);
		return factory;
	}

	CharSequence readFile(String file) throws IOException {
		FileInputStream fin = new FileInputStream(file);
		FileChannel ch = fin.getChannel();
		ByteBuffer buffer = ch.map(MapMode.READ_ONLY, 0, ch.size());
		return Charset.defaultCharset().decode(buffer);
	}
	
	//扫描方法时,把方法名加入到一个list中
	static class MethodScanner extends
			TreeScanner<List<String>, List<String>> {
		@Override
		public List<String> visitMethod(MethodTree node, List<String> p) {
			p.add(node.getName().toString());
			return p;
		}
	}

	public static void main(String[] args) throws IOException {
		JDKParser parser = new JDKParser();
		for (String method : parser.parseMethodDefs("User.java")) {
			System.out.println(method);
		}
	}
}

 

1.parser.parseCompilationUnit();获得语法树

2.MethodScanner扫描整颗语法树,整个扫面其实是fold/reduce过程

0
2
分享到:
评论

相关推荐

    JDK的Parser来解析Java源代码详解

    JavaParser类是用于演示如何使用JDK的内部编译API来解析Java源代码的示例。JDK的Parser是Java Compiler API的一部分,它允许我们解析Java源文件并获取其抽象语法树(AST)。虽然这不是Oracle和OpenJDK官方公开的API,...

    java-7-openjdk-amd64

    安装包:java-7-openjdk-amd64.tar.gz 使用方法 1. 拷贝至服务器/个人电脑 2. 解包 mkdir /opt/jdk/ tar -zxvf java-7-openjdk-amd64.tar.gz -C /opt/jdk/ 3. 配置编译环境 JAVA_HOME=/opt/jdk/java-7-openjdk-amd...

    java-1.8.0-openjdk

    OpenJDK 由 OpenJDK 社区开发并维护,旨在提供一个符合 Java SE 标准的开放源代码实现,允许开发者在各种操作系统上编写、编译和运行 Java 应用程序。这个特定的版本是 "1.8.0.292-2.b10.dev.redhat",表明它基于 ...

    java-1.8.0-openjdk-1.8.0.275-1.b01.dev.redhat.windows.x86_64.zip

    OpenJDK是Java Development Kit(JDK)的一个实现,由甲骨文公司(Oracle)赞助并维护,但其源代码开放,允许社区参与开发和改进。这个版本号1.8.0.275-1.b01.dev.redhat代表着特定的更新和修复,是针对Windows x86_...

    java-8-openjdk-amd64

    Java 8 OpenJDK AMD64 是一个针对64位AMD架构的开源Java开发和运行环境,由OpenJDK项目提供。OpenJDK是Java Development Kit(JDK)的一个实现,它遵循GNU General Public License(GPL)条款,旨在提供一个免费、...

    openjdk6 源代码

    openjdk6 源代码,分开也上传一份,省得太大了。

    openjdk 6-7-8-9 源代码

    这个压缩包包含了OpenJDK 6、7、8和9四个版本的源代码,对于学习Java语言、理解JVM工作原理以及进行Java平台的开发和优化有着重要的价值。 首先,让我们逐一探讨这些版本的源代码: 1. **OpenJDK 6**:这是Java SE...

    openjdk7源代码

    通过深入研究OpenJDK7的源代码,开发者可以了解Java语言的底层实现,包括JVM的工作原理、垃圾收集机制、类加载过程等,对于提升Java编程技巧和解决实际问题有极大的帮助。同时,OpenJDK项目是一个活跃的开源社区,...

    基于java的开发源码-OpenJDK Java开发环境.zip

    基于java的开发源码-OpenJDK Java开发环境.zip 基于java的开发源码-OpenJDK Java开发环境.zip 基于java的开发源码-OpenJDK Java开发环境.zip 基于java的开发源码-OpenJDK Java开发环境.zip 基于java的开发源码-...

    java-11-openjdk-11.0.8.10-1.windows.ojdkbuild.x86_64.zip

    Java 11 OpenJDK 11.0.8.10-1 是一个针对Windows操作系统的开源Java Development Kit(JDK)版本。OpenJDK是Java平台标准版(Java SE)的一个开源实现,由Oracle公司发起并维护,旨在提供Java编程环境。此版本号11.0...

    jdk6&openjdk;源代码

    OpenJDK6是OpenJDK项目针对Java 6版本的源代码,它的开放性使得开发者能够深入理解Java的内部机制,从而进行定制化开发或者优化。 OpenJDK的源代码结构分为多个模块,每个模块对应着Java平台的一部分功能。主要模块...

    java编译器源代码.rar

    Java编译器的源代码通常使用版本控制系统(如Git)进行管理,以便于协作开发和历史版本追踪。 10. **学习价值**: 分析和研究Java编译器源代码有助于深入理解Java语言的底层机制,对提升编程技能、优化代码性能...

    Java源代码下载

    Java源代码下载通常指的是获取Java开发工具包(JDK)中的源码,这对于开发者来说是一项重要的活动,因为源代码能够帮助他们深入理解Java语言的工作原理,进行调试和学习。Java作为一个开源项目,Oracle公司提供了源...

    java1.7-openjdk-amd64.zip

    在 Ubuntu 14.04 及更高版本中,由于默认的软件源不再提供 OpenJDK 1.7,因此,如果你需要使用这个特定版本的 Java,必须通过手动方式来安装。OpenJDK(Open Java Development Kit)是 Java 平台标准版(Java SE)的...

    java-7-openjdk-amd64.tar.gz

    把这些JRL许可证形式的Sun/OracleJDK源码和对应版本的OpenJDK源码进行比较,发现除了文件头的版权注释之外,其余代码基本上都是相同的,只有字体渲染部分存在一点差异,Oracle JDK采用了商业实现,而OpenJDK使用的是...

    openjdk-8.zip

    OpenJDK 8是Java开发工具包(Java Development Kit)的一个开源实现,它为开发者提供了构建、测试和运行Java应用程序所需的工具和Java虚拟机(JVM)。Ubuntu是一个流行的Linux操作系统,广泛用于服务器和桌面环境。...

    openjdk8 源代码

    openjdk8 源代码,分开也上传一份,省得太大了。

    java-1.8.0-openjdk.linux.x86_64

    OpenJDK项目的目标是提供一个免费、开放源代码的Java平台,使得开发者可以自由地查看、修改和分发代码,推动Java技术的发展。 在Linux环境下,Java 1.8.0 OpenJDK 包括了运行Java应用程序所需的全部组件,如Java...

    openjdk1.6

    OpenJDK项目的目标是提供一个免费、开源的Java实现,鼓励社区参与和透明度,使得开发者可以查看并修改源代码,以适应不同的需求或为项目贡献改进。 1. **OpenJDK概述**: OpenJDK是由Sun Microsystems启动的项目,...

Global site tag (gtag.js) - Google Analytics