簡體   English   中英

Eclipse插件:從IResourceChangeListener返回受影響的類

[英]Eclipse plugin: Return affected class from IResourceChangeListener

我確實有一個IResourceChangeListener來偵聽工作空間中的更改。 但是,我無法僅返回觸發IResourceChangeEvent的類。

這就是我目前擁有的:

public class ResourceChangeListener implements IResourceChangeListener {

    private Logger logger = Logger.getAnonymousLogger();

    public void resourceChanged(IResourceChangeEvent event) {
        IResourceDelta[] allChanges = event.getDelta().getAffectedChildren();

        for(IResourceDelta delta : allChanges) {
            // only check projects when there are actual changes (4 = CHANGED)
            if(delta.getKind() == 4) {
                try {
                    IPackageFragment[] packages = JavaCore.create(delta.getResource().getProject()).getPackageFragments();
                    IPackageFragment myPackage = null;

                    // get current project package
                    for(IPackageFragment currentPackage : packages) {
                        if(currentPackage.getKind() == IPackageFragmentRoot.K_SOURCE) {
                            myPackage = currentPackage;
                        }
                    }

                    // get all compilation units from package and parse them for new achievements
                    ICompilationUnit[] units = myPackage.getCompilationUnits();
                    for(ICompilationUnit unit : units) {
                        // do something with ICompilationUnits
                    }
                }
                catch (JavaModelException e) {
                    // catch exception here
                }
            }
        }
    }

}

此嘗試將返回受影響的整個程序包。 因此,我只能循環訪問其中的所有ICompilationUnits。

與此相反,我的目標是讓班級發生實際的變化 有可能嗎?

感謝greg,我得以找到解決方案。

我的第一堂課現在看起來像這樣:

public class ResourceChangeListener implements IResourceChangeListener {

    private Logger logger = Logger.getAnonymousLogger();

    public void resourceChanged(IResourceChangeEvent event) {
        IResourceDelta[] allChanges = event.getDelta().getAffectedChildren();

        for(IResourceDelta delta : allChanges) {
            if(delta.getKind() == 4) {  // only check projects when there are actual changes (4 = CHANGED)
                try {
                    // visits resource deltas
                    ResourceDeltaVisitor resourceDeltaVisitor = new ResourceDeltaVisitor();
                    delta.accept(resourceDeltaVisitor);
                    ArrayList<IResource> changedClasses = resourceDeltaVisitor.getChangedResources();

                    for(IResource changedClass : changedClasses) {
                        ICompilationUnit iCompilationUnit = (ICompilationUnit)JavaCore.create(changedClass);
                        // do something with ICompilationUnits...
                    }
                }
                catch (CoreException e1) {
                    // catch exception here
                }
            }
        }
    }

}

我的ResourceDeltaVisitor類如下所示:

public class ResourceDeltaVisitor implements IResourceDeltaVisitor {

    private ArrayList<IResource> changedClasses = new ArrayList<IResource>();

    public boolean visit(IResourceDelta delta) {
        IResource res = delta.getResource();
        if(res.getName().endsWith(".java")) {
            addResource(res);
        }
        return true; // visit the children
    }

    public ArrayList<IResource> getChangedResources() {
        return changedClasses;
    }

    private void addResource(IResource res) {
        changedClasses.add(res);
    }
}

這不是最佳解決方案,但對我有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM