eclipse插件开发总结

       下载地址: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();

       
        }




额 因为最近忙别的去了, 已经有好段时间没写这个插件了,已经没当初的感觉了,本来都不想写了,这个博客没写好,主要是想把一些方法列出来,方便今后查看

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值