文档章节

Eclipse新建类向导

素人派
 素人派
发布于 2016/12/31 20:47
字数 634
阅读 40
收藏 0
  • 介绍
Eclipse新建类的时候,是可以自动添加一个main方法的,这个是怎么做到的呢?我们可不可以修改这个向导,从而添加别的方法? 使用过自动添加getter和setter方法的小盆友,想不想知道Eclipse又是怎么做到的?我们可不可以在给PO添加getter和setter方法的同时把我们需要的例如@Entity、@Column等注解也添加好呢? 实际上,Eclipse还可以帮我们把注释也根据既定规则来添加好。
  • main方法的玄机
通过反编译Eclipse安装根目录中的plugins文件夹下的org.eclipse.jdt.ui_xxx.jar文件或者访问 http://grepcode.com可以看到源代码。 org.eclipse.jdt.internal.ui.wizards.NewClassCreationWizard是用于新建一个Java类的向导 org.eclipse.jdt.ui.wizards.NewClassWizardPage是新建类向导的UI页面,要注意这个类的包路径中没有internal,也就是说我们可以通过继承的方式来修改或者增加功能 org.eclipse.jdt.ui.CodeGeneration是JDT对外提供代码生成的一个工具类 org.eclipse.jdt.internal.corext.codemanipulation.StubUtility是JDT对CodeGeneration的内部实现 main方法的添加就在NewClassWizardPage.createTypeMembers中实现,这里主要调用了:CodeGeneration.getMethodComment(用于方法上注释的添加)、CodeGeneration.getMethodBodyContent(用于方法的添加)。方法的头部和尾部还是要我们通过字符串拼接来完成的。最终,org.eclipse.jdt.core.IType接口提供了createField(添加属性)、createMethod(添加方法)。
  • 添加注解
下面是代码片段: [codesyntax lang="java"]
/**
 * 添加属性
 * @throws JavaModelException 
 */
private void createField(POField poField) throws JavaModelException {
	StringBuffer buf = new StringBuffer();
	buf.append(poField.getAccess());
	buf.append(" ");
	buf.append(poField.getType());
	buf.append(" ");
	buf.append(poField.getName());
	buf.append(";");
	
	IField field = type.createField(buf.toString(), null, false, null);
	
	StringBuffer annotationBuf = new StringBuffer();
	annotationBuf.append("@Comment(\"");
	annotationBuf.append(poField.getComment());
	annotationBuf.append("\")");
	addAnnotation(field, annotationBuf);
}

/**
 * 添加getter方法
 * @param poField
 * @throws CoreException
 */
private void getGetterMethod(POField poField) throws CoreException {
	String name = poField.getName();
	
	String content = CodeGeneration.getGetterMethodBodyContent(
			type.getCompilationUnit(),
			type.getTypeQualifiedName('.'),
			"", name, "\n");
	
	StringBuffer buf = new StringBuffer();
	buf.append("public ");
	buf.append(poField.getType());
	buf.append(" get").append(name.substring(0, 1).toUpperCase()).append(name.substring(1));
	buf.append("(){\n");
	buf.append(content);
	buf.append("\n}");
	
	IMethod method = type.createMethod(buf.toString(), null, false, null);
	
	//add annotation
	StringBuffer annotationBuf = new StringBuffer();
	annotationBuf.append("@Column(name = \"");
	annotationBuf.append(POUtil.getColumnName(poField.getName()));
	annotationBuf.append("\", length = ");
	annotationBuf.append(poField.getLength());
	annotationBuf.append(")");
	addAnnotation(method, annotationBuf);
}

/**
 * 添加注解
 * @param member 要添加注解的元素
 * @param buf 注解内容,会自动添加换行符
 * @throws JavaModelException
 */
private void addAnnotation(IMember member, StringBuffer buf) throws JavaModelException {
	ISourceRange range = member.getSourceRange();
	IBuffer typeBuf = type.getCompilationUnit().getBuffer();
	
	buf.append("\n");
	buf.append(typeBuf.getText(range.getOffset(), range.getLength()));
	
	typeBuf.replace(range.getOffset(), range.getLength(), buf.toString());
}
[/codesyntax]
  • 参考
这里有基于Eclipse提供的API的代码生成技术 如果想看更底层的代码生成的话,请看《JCodeModel》 想要自己开发一个Eclipse插件的话,这里有篇Helloworld供你参考。 在Eclipse中到底有哪些扩展点呢?这里有个清单,还有对应的教程哦。

本文转载自:http://surenpi.com/2015/09/23/eclipse_new_class_wizard/

素人派
粉丝 26
博文 1907
码字总数 10223
作品 6
东城
程序员
私信 提问

暂无文章

利用mybatis generator生成实体类、Mapper接口以及对应的XML文件

项目中通常会遇到数据的持久化,如果是采用mybatis的orm,就会涉及到生成xml的问题,刚好mybatis官网提供了这么个插件MyBatis Generator,效果简直是棒呆。 1. 首先需要在build.gradle文件中...

啊哈关关
今天
2
0
SpringSocial相关的知识点

使用SprigSocial开发第三方登录 核心类 ServiceProvider(AbstractOauth2ServiceProvider):主要负责实现server提供商(例如QQ,微信等共有的东西),默认实现类是AbstractOauth2ServiceProvider...

chendom
今天
1
0
Java并发之AQS详解

一、概述   谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)!   类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源...

群星纪元
昨天
2
0
Fabric-sdk-java最新教程

Fabric Java SDK是Fabric区块链官方提供的用于Java应用开发的SDK,全称为Fabric-sdk-java,网上可用资料不多,本文列出了精心整理的针对Fabric Java SDK的最新精选教程。 如果希望快速掌握F...

汇智网教程
昨天
2
0
react 子组件监听props 变化

componentWillReceiveProps //已经被废弃 getDerivedStateFromProps// 推荐使用//如果条件不存在必须要返回null static getDerivedStateFromProps(props, current_stat...

一箭落旄头
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部