2010-07-17 13 views
7

Escribo un plugin de Eclipse, y estaba tratando de crear un método que devuelva todas las clases en el espacio de trabajo en un ArrayList < \ Class < \? >> (Agregué el " \ "para incluir los corchetes genéricos ya que html no me permitirá hacerlo de lo contrario).Obteniendo todas las clases del área de trabajo actual en Eclipse

Aquí está el código que tengo:

private ArrayList<Class<?>> getAllClasses() throws JavaModelException { 

ArrayList<Class<?>> classList = new ArrayList<Class<?>>(); 

IWorkspace workspace = ResourcesPlugin.getWorkspace(); 
IWorkspaceRoot root = workspace.getRoot(); 
IProject[] projects = root.getProjects(); 

for (IProject project : projects) { 
    IJavaProject javaProject = JavaCore.create(project); 
    IPackageFragment[] packages = javaProject.getPackageFragments(); 

    for (IPackageFragment myPackage : packages) { 
    IClassFile[] classes = myPackage.getClassFiles(); 

    for (IClassFile myClass : classes) { 
    classList.add(myClass.getClass()); 
    } 
    } 
} 

    return classList; 
} 

Esto, sin embargo, no parece estar funcionando. Tuve algunas líneas impresas, y me di cuenta de que también incluye clases irrelevantes (es decir, clases de Java \ jre6 \ lib \ rt.jar). ¿Alguna sugerencia?

+0

Por favor refiérase a http://help.eclipse.org/helios/index.jsp?topic=/org.eclipse.jdt.doc.isv/guide/jdt_int_model.htm Aquí se puede encontrar una descripción bastante buena del Modelo JDT. – GeT

Respuesta

0

Quizás pueda utilizar el método IJavaProject.getAllPackageFragmentRoots() para obtener toda la carpeta de origen, y luego obtener ICompilationUnits en ella.

1

no estoy seguro de lo que quiere hacer:

  • En una ejecución Eclipse plug-in, mostrar todas las clases que se ejecutan en la JVM con el plug-in (es decir, clases para otros editores, vistas, maquinaria Eclipse)?
  • En un complemento Eclipse en ejecución, ¿muestra todas las clases que se están creando en proyectos abiertos de Java en el área de trabajo? (Dado que utilizó la palabra "espacio de trabajo", sospecho que esto es lo que estás buscando.)

Nota en este último caso, usted no será capaz de obtener reales de Java Class<...> objetos, debido a que los proyectos que se están editado y compilado no se cargan para su ejecución en la misma JVM que su complemento. El código de su complemento se estaría ejecutando junto con el código de la herramienta Eclipse IDE y Eclipse JDT; la única vez que las clases en proyectos abiertos se cargarían para su ejecución (producir objetos Class<...> en algún lugar) sería cuando ejecute o depure uno de esos proyectos. . . en cuyo caso se trata de una nueva JVM, y su complemento ya no existe. ¿Tiene sentido?

Si te leo bien, creo que probablemente quieras encontrar "unidades de compilación", no "archivos de clase". Las "unidades de compilación" se corresponden con los archivos de origen .java, mientras que los "archivos de clase" se corresponden con los archivos de clase binarios preconstruidos (a menudo en archivos JAR). O tal vez necesitas ambos. Mejor aún, parece que lo que realmente quieres son los "tipos" dentro de esos.

Consulte la JDT Core guide para obtener información bastante buena que es notablemente difícil de encontrar. Tenga en cuenta que algunos análisis son posibles en el nivel de Java Model, pero análisis más detallados (por ejemplo, buscando definiciones de métodos "dentro") requerirán analizar partes de código en AST y partir de allí. El Java Model es bastante cómodo de usar, pero las cosas de AST pueden ser un poco intimidantes la primera vez.

Considere también el motor de búsqueda de Java (documentado cerca de lo anterior) y IType.newTypeHierarchy() para buscar y navegar por los tipos.

¡Buena suerte!

1

Usted debe tratar:

for (final ICompilationUnit compilationUnit : packageFragment.getCompilationUnits()) { 
     // now check if compilationUnit.exits 
} 

No conseguir un CompilationUnit para este tipo de binarios.

0

Tengo una solución mucho más simple para un proyecto de eclipse si solo busca listar nombres de clase java para el paquete actual y agregarlos a una lista de clases (reemplace PARENT_CLASS por el nombre de la clase principal de todas sus clases) :

List<PARENT_CLASS> arrayListOfClasses = new ArrayList<>(); 

    String currentDir = new java.io.File("").toURI().toString().split("file:/")[1]; 
    System.out.println("currentDir=" + currentDir); 
    String[] dirStringTab = currentDir.split("/"); 
    String currentPackageName = dirStringTab[dirStringTab.length-1]; 
    System.out.println("currentPackageName=" + currentPackageName); 

    File dir = new File("./src/" + currentPackageName + "/"); 
    File[] filesList = dir.listFiles(); 
    String javaClassNameWithoutExtension = ""; 

    for (File file : filesList) { 
     if (file.isFile()) { 
      System.out.println(javaClassNameWithoutExtension); 
      javaClassNameWithoutExtension = file.getName().split(".java")[0]; 

     Class c = Class.forName(javaClassNameWithoutExtension); 
     Object a = c.newInstance(); 
     arrayListOfClasses.add(a); 

     } 
    } 
Cuestiones relacionadas