下载地址:http://download.csdn.net/detail/darrenzhong/7469917
最近一个礼拜研究了eclipse插件开发,发现国内开发插件的人太少了,很多问题只能自己去查API 或者 看老外留下的代码,这里我总结下自己所用到的一些东西,方便其他人更快的查询到需要的方法。
首先我说下我做的这个插件:用于springMVC,由于springMVC没有像struts1 2 那样,有个专门的跳转路径的配置文件,导致springMVC不能直观方便的看到方法(Action)和路径对应的匹配,所以我这个插件会把eclipse里工作空间的项目全部集成到一个界面,这个界面提供项目选择,选择后,如果是springMVC集成开发的项目,就会把这个java类的信息关联进来,显示这个类的包名,文件名,然后是方法名,然后跳转路径,返回方法。然后提供了可以修改方法名和注解url路径的操作,再次强调 这只是我写的一个demo。
代码方法总结:
1.得到工作空间所有的项目
public static IProject[] getAllProject(){
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
return root.getProjects();
}
2.得到所有项目的名称
public static String[] getAllProjectName(){
List<String> str = new ArrayList<String>();
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IProject[] a = root.getProjects();
for (int i = 0; i < a.length; i++) {
str.add(a[i].getName());
}
return str.toArray(new String[str.size()]);
}
3.类似java里面反射的操作(想获取方法名 注解等等)
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IProject[] projects = root.getProjects();
// process each project
try {
//遍历所有方法
for (IProject project : projects) {
if(project.getName().equals("RemoteSystemsTempFiles")){
continue;
}
IJavaProject javaProject = JavaCore.create(project);
//获取到所有的package
IPackageFragment[] packages = javaProject.getPackageFragments();
// process each package
for (IPackageFragment aPackage : packages) {
if (!aPackage.getPath().toString().endsWith(".jar")) {
//ICompilationUnit相当于一个java 编译元素
for (final ICompilationUnit compilationUnit : aPackage.getCompilationUnits()) {
//获取到itype 里面可以拿到你想要的一些东西了
IType[] itype= compilationUnit.getTypes();
for (int i = 0; i < itype.length; i++) {
//获取所有方法
IMethod[] meth= itype[i].getMethods();
for (int j = 0; j < meth.length; j++) {
//通过方法拿到注解
if(meth[j].getAnnotation("RequestMapping").exists()){
//获取返回类型
String returnType= meth[j].getReturnType();
//拿注解里面的value值
meth[j].getAnnotation("RequestMapping").getMemberValuePairs()[0].getValue().toString()
}
}
}
}
}
}
}
其实这里拿到Itype 后面就好了 可以直接查API了 我原来就是找这个IType找了很多资料 最后还是在国外的网站上看到的 这个方法是用来读的
4.这点是用来update的
public void changeMethod(Info info,String newMethod,String flag){
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IProject[] projects = root.getProjects();
try {
for (IProject project : projects) {
if(project.getName().equals(info.getProjectName())){
IJavaProject javaProject = JavaCore.create(project);
IPackageFragment[] packages = javaProject.getPackageFragments();
for (IPackageFragment aPackage : packages) {
if(aPackage.getElementName().equals(info.getPackageName())){
for (final ICompilationUnit compilationUnit : aPackage.getCompilationUnits()) {
if(compilationUnit.getElementName().equals(info.getClassName()+".java")){
IProgressMonitor monitor= new NullProgressMonitor();
//打开一个缓冲区
compilationUnit.becomeWorkingCopy(monitor);
//获取到java文件的内容
String source = compilationUnit.getBuffer().getContents();
Document document = new Document(source);
ASTParser parser = ASTParser.newParser(AST.JLS4);
parser.setSource(compilationUnit);
CompilationUnit asRoot = (CompilationUnit)parser.createAST(monitor);
ASTRewrite rewrite = ASTRewrite.create(asRoot.getAST());
//获取所有方法
MethodDeclaration method[] = ((TypeDeclaration)asRoot.types().get(0)).getMethods();
for(int k=0; k<method.length;k++){
if(method[k].getName().toString().equals(info.getMethod())){
//System.out.println(((MemberValuePair)((NormalAnnotation)method[k].modifiers().get(0)).values().get(0)).getValue().);
SimpleName oldName = null;
SimpleName newName = null;
if("url".equals(flag)){
//下面一段是为了修改注解的value
NormalAnnotation annot = null;
List lis = method[k].modifiers();
for (int i = 0; i < lis.size(); i++) {
if(lis.get(i).toString().contains("RequestMapping")){
annot=(NormalAnnotation)lis.get(i);
break;
}
}
final ListRewrite listRewrite = rewrite.getListRewrite(method[k], method[k].getModifiersProperty());
listRewrite.remove(annot, null);
MemberValuePair mV = annot.getAST().newMemberValuePair();
mV.setName(annot.getAST().newSimpleName("value"));
StringLiteral stringLiteral = annot.getAST().newStringLiteral();
stringLiteral.setLiteralValue(newMethod);
mV.setValue(stringLiteral);
annot.values().set(0, mV);
listRewrite.insertAt(annot, 0, null);
}else{
//这个是修改方法名
oldName=method[k].getName();
newName =method[k].getAST().newSimpleName(newMethod);
rewrite.replace(oldName, newName, null);
}
TextEdit edits=rewrite.rewriteAST(document, compilationUnit.getJavaProject().getOptions(true));
edits.apply(document);
String newSource= document.get();
compilationUnit.getBuffer().setContents(newSource);
//类似于保存操作
compilationUnit.commitWorkingCopy(true, monitor);
if(compilationUnit != null){
compilationUnit.discardWorkingCopy();
}
break;
}
}
}
}
}
}
}
}
}catch (JavaModelException e) {
e.printStackTrace();
} catch (MalformedTreeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
额 因为最近忙别的去了, 已经有好段时间没写这个插件了,已经没当初的感觉了,本来都不想写了,这个博客没写好,主要是想把一些方法列出来,方便今后查看