文档章节

Eclipse插件开发JDT组件介绍

素人派
 素人派
发布于 2016/12/31 20:44
字数 875
阅读 67
收藏 0
  • 介绍
JDT(Java Development Tools)是Eclipse中有关Java开发的一个组件,该组件中封装了大多数Java开发中的功能,也可以说它是Eclipse支持Java开发的核心组件。 本文将会介绍到:AST(Abstract Syntax Tree)、IProject、IJavaProject、IType等内容。 想了解更多Eclipse中的组件,可以在本站中搜索“Eclipse框架下的组件”。 下面先对几个重要的接口进行介绍。
  • AST
JDT组件使用AST将Java中的对象(接口、类、方法、属性等)建立了一系列的模型。通过AST可以把Java对象当做一个树,用访问节点的方式来修改。
  • IJavaElement
[caption id="attachment_4314" align="aligncenter" width="217"] ijavaelement_tree ijavaelement_tree[/caption] 从上图中可以看到org.eclipse.jdt.core.IJavaElement接口是所有Java对象模型中的父,而且JDT中包含了所有的Java对象。 IType代表一个类 IMethod代表一个方法 IAnnotation代表一个注解 下面是一个可以创建一个Java类型的例子: [codesyntax lang="java"]
/**
	 * 创建一个类(class)或者接口(interface)
	 * @param project 工程对象
	 * @param type 应当是class、interface或者enum
	 * @param packageName 包名
	 * @param typeName 应当是Java源文件名称但不包含后缀,例如:Test.java就应该是Test
	 * @param superCls 父类
	 * @param superInters 接口列表
	 * @return
	 */
	public static ICompilationUnit createCompilationUnit(IJavaProject project, String type,
			String packageName, String typeName, IProgressMonitor monitor, String superCls, String ...superInters) {
		IPackageFragmentRoot packageFragmentRoot = null;
		ICompilationUnit unit = null;
		
		try {
			//先查找当前工程中是否已经有了给类型
			IType targetType = project.findType(packageName, typeName, monitor);
			if(targetType != null){
				unit = targetType.getCompilationUnit();
			}
		} catch (JavaModelException e) {
			Logger.error(e.getMessage(), e);
		}
		
		
		try {
			if(unit == null){
				try {
					//查找可以用于创建Java类型的包
					IPackageFragmentRoot[] roots = project.getPackageFragmentRoots();
					for(IPackageFragmentRoot root : roots){
						if(root.isReadOnly() || root.isArchive() || root.isExternal()){
							continue;
						}
						
						packageFragmentRoot = root;
						break;
					}
				} catch (JavaModelException e) {
					Logger.error(e.getMessage(), e);
				}
				
				IPackageFragment packageFragment = packageFragmentRoot.getPackageFragment(packageName);
				//创建一个内容为空的Java类型
				unit = packageFragment.createCompilationUnit(String.format("%s.java", typeName), "", false, monitor);
			}
			
			unit.becomeWorkingCopy(monitor); //先把当前编译对象变为副本
			
			IBuffer buffer = unit.getBuffer();
			   
			String simpleTypeStub = constructSimpleTypeStub(type, typeName, superCls, superInters);
			String lineDelimiter = System.getProperty("line.separator", "\n");
			String cuContent = constructCUContent(unit, simpleTypeStub, lineDelimiter, monitor);
			
			buffer.setContents(cuContent);
			
			return unit;
		} catch (JavaModelException e) {
			Logger.error(String.format("创建Java过程失败,详细信息[%s]。", e.getMessage()), e);
		} catch (CoreException e) {
			Logger.error(e.getMessage(), e);
		}
		
		return unit;
	}
	
	public static String constructSimpleTypeStub(String typeName) {
		return constructSimpleTypeStub("class", typeName, null);
	}

	public static String constructSimpleTypeStub(String type, String typeName, String superCls, String ...superInters) {
		StringBuffer buf = new StringBuffer("public ");
		buf.append(type);
		buf.append(" ");
		buf.append(typeName);
		
		if(StringUtil.isNotEmpty(superCls)) {
			buf.append(" extends ");
			buf.append(superCls);
		}
		
		if(superInters != null && superInters.length > 0) {
			buf.append(" implements");
			for(String superInter : superInters) {
				buf.append(" ");
				buf.append(superInter);
			}
		}
		
		buf.append("{\n}");
		return buf.toString();
	}
	
	/**
	 * 构建Java类型的具体文件内容
	 * @param cu
	 * @param typeContent
	 * @param lineDelimiter
	 * @return
	 * @throws CoreException
	 */
	public static String constructCUContent(ICompilationUnit cu, String typeContent, String lineDelimiter,
			IProgressMonitor monitor) throws CoreException {
		String fileComment = "";// getFileComment(cu, lineDelimiter);
		String typeComment = "";// getTypeComment(cu, lineDelimiter);
		IPackageFragment pack = (IPackageFragment) cu.getParent();
		String content = CodeGeneration.getCompilationUnitContent(cu, fileComment, typeComment, typeContent, lineDelimiter);
		
		if (content != null) {
			ASTParser parser = ASTParser.newParser(AST.JLS8);
			parser.setProject(cu.getJavaProject());
			parser.setSource(content.toCharArray());
			
			CompilationUnit unit = (CompilationUnit) parser.createAST(monitor);
			if (((pack.isDefaultPackage()) || (unit.getPackage() != null)) && (!unit.types().isEmpty())) {
				return content;
			}
		}
		
		StringBuffer buf = new StringBuffer();
		if (!pack.isDefaultPackage()) {
			buf.append("package ").append(pack.getElementName()).append(';');
		}
		buf.append(lineDelimiter).append(lineDelimiter);
		if (typeComment != null) {
			buf.append(typeComment).append(lineDelimiter);
		}
		buf.append(typeContent);
		
		return buf.toString();
	}
[/codesyntax]
  • IPackageFragmentRoot
IPackageFragment createPackageFragment(String name, boolean force, IProgressMonitor monitor)throws JavaModelException; 该方法可以创建一个包(package),创建完之后需要调用接口IPackageFragment的保存(save)方法。
  • IParent
[caption id="attachment_4316" align="aligncenter" width="300"] iparent_tree iparent_tree[/caption] 从上图中可以看到org.eclipse.jdt.core.IJavaProject并不是接口org.eclipse.core.resources.IProject的子接口,这一点一定要注意——IJavaProject和IProject是包含关系。
  • IContainer
[caption id="attachment_4317" align="aligncenter" width="300"] icontainer_tree icontainer_tree[/caption] 从上图中可以看到,在Eclipse中文件夹(IFolder)和工程(IProject)以及工作空间(IWorkspaceRoot)是同等级的,都是属于容器(容器也是一种资源)。
  • IResource
[caption id="attachment_4315" align="aligncenter" width="300"] iresource_tree iresource_tree[/caption] org.eclipse.core.resources.IResource接口是Eclipse中所有资源(文件、文件夹、工程、workspace等)的父。
  • IProject
project.refreshLocal(IResource.DEPTH_INFINITE, monitor); 该方法可以刷新当前工程 未完待续。。。

本文转载自:http://surenpi.com/2016/05/20/eclipse_plugin_dev_jdt_intro/

素人派
粉丝 26
博文 1907
码字总数 10223
作品 6
东城
程序员
私信 提问
Eclipse基金会十周年:知名开源项目盘点

  【IT168 专稿】Eclipse基金会已经成立了整整10年了。目前,这个开源组织拥有众多项目,其中就包含了最为出名的Java IDE Eclipse以及Mylyn。在Eclipse基金会成立之初,由其发起并指导的项...

it168网站
2014/02/24
0
0
Java开发平台 Eclipse 4.2 M2 发布

【IT168 资讯】继Eclipse Foundation发布了第一个支持Java 7的里程碑版 Eclipse 3.8M1后,近日Eclipse 4.2 M2 也随之发布了! Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其...

作者:皮丽华
2011/09/20
0
0
跨平台开源集成开发环境--Eclipse

Eclipse是著名的跨平台的自由集成开发环境(IDE)。最初主要用来Java语言开发,但是目前亦有人通过插件使其作为其他计算机语言比如C++和Python的开发工具。 Eclipse的本身只是一个框架平台,...

匿名
2008/09/07
489.8K
83
Eclipse的网友评论

Eclipse是著名的跨平台的自由集成开发环境(IDE)。最初主要用来Java语言开发,但是目前亦有人通过插件使其作为其他计算机语言比如C++和Python的开发工具。 Eclipse的本身只是一个框架平台,...

红薯
2009/12/11
1K
2
Eclipse与MyEclipse的联系和区别

Eclipse与MyEclipse的介绍 Eclipse 是一个IDE(Integrated Developing Environment),而这个IDE是允许安装第三方开发的插件来使自身的功能得到扩展和增强的,而Myeclipse就是其中的一种有名...

xzs1913
2012/07/18
505
0

没有更多内容

加载失败,请刷新页面

加载更多

一起来学Java8(三)——方法引用

在一起来学Java8(一)——函数式编程中有一个简单的函数式编程的例子: import java.util.function.Consumer;class Person { public static void sayHello(String name) { S...

猿敲月下码
15分钟前
8
0
读书笔记:深入理解ES6(十一)

第十一章 Promise与异步编程   Promise可以实现其他语言中类似Future和Deferred一样的功能,是另一种异步编程的选择,它既可以像事件和回调函数一样指定稍后执行的代码,也可以明确指示代码...

张森ZS
39分钟前
13
0
面试官,Java8 JVM内存结构变了,永久代到元空间

在文章《JVM之内存结构详解》中我们描述了Java7以前的JVM内存结构,但在Java8和以后版本中JVM的内存结构慢慢发生了变化。作为面试官如果你还不知道,那么面试过程中是不是有些露怯?作为面试...

程序新视界
46分钟前
27
0
Elasticsearch 实战(一) - 简介

官腔 Elasticsearch,分布式,高性能,高可用,可伸缩的搜索和分析系统 基本等于没说,咱们慢慢看 1 概述 百度:我们比如说想找寻任何的信息的时候,就会上百度去搜索一下,比如说找一部自己喜...

JavaEdge
51分钟前
19
0
【jQuery基础学习】11 jQuery性能简单优化

本文转载于:专业的前端网站➦【jQuery基础学习】11 jQuery性能简单优化 关于性能优化 合适的选择器 $("#id")会直接调用底层方法,所以这是最快的。如果这样不能直接找到,也可以用find方法继...

前端老手
今天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部