Je sais que je suis quelques années de retard pour cette partie, mais je suis tombé sur cette question d'essayer de résoudre le même problème. Vous pouvez utiliser Eclipse interne de la recherche par programmation, si vous écrivez un Plugin Eclipse (et donc de profiter de leur mise en cache, etc), afin de trouver des classes qui implémentent une interface. Voici mon (très approximatif) la première coupe:
protected void listImplementingClasses( String iface ) throws CoreException
{
final IJavaProject project = <get your project here>;
try
{
final IType ifaceType = project.findType( iface );
final SearchPattern ifacePattern = SearchPattern.createPattern( ifaceType, IJavaSearchConstants.IMPLEMENTORS );
final IJavaSearchScope scope = SearchEngine.createWorkspaceScope();
final SearchEngine searchEngine = new SearchEngine();
final LinkedList<SearchMatch> results = new LinkedList<SearchMatch>();
searchEngine.search( ifacePattern,
new SearchParticipant[]{ SearchEngine.getDefaultSearchParticipant() }, scope, new SearchRequestor() {
@Override
public void acceptSearchMatch( SearchMatch match ) throws CoreException
{
results.add( match );
}
}, new IProgressMonitor() {
@Override
public void beginTask( String name, int totalWork )
{
}
@Override
public void done()
{
System.out.println( results );
}
@Override
public void internalWorked( double work )
{
}
@Override
public boolean isCanceled()
{
return false;
}
@Override
public void setCanceled( boolean value )
{
}
@Override
public void setTaskName( String name )
{
}
@Override
public void subTask( String name )
{
}
@Override
public void worked( int work )
{
}
});
} catch( JavaModelException e )
{
e.printStackTrace();
}
}
Le premier problème que je vois pour l'instant est que je suis le seul à en attraper des classes directement implémenter l'interface, pas tous les sous-classes - mais un peu de récursivité jamais fait de mal à personne.