Example #1
0
  private void deleteClasses(@NotNull ClassDescriptorSourceUnit sourceFile) {
    // Puede ocurrir que esta clase nunca se haya cargado y se ha modificado el código fuente y
    // queramos limpiar
    // los .class correspondientes pues se van a recrear
    // como no conocemos qué inner clases están asociadas para saber que .class hay que eliminar,
    // pues lo que
    // hacemos es directamente obtener los .class que hay
    // en el directorio con el fin de eliminar todos .class que tengan el patrón de ser inner
    // classes del source
    // file de acuerdo a su nombre
    // así conseguimos por ejemplo también eliminar las local classes (inner clases con nombre
    // declaradas dentro
    // de un método) que no hay manera de conocer
    // a través de la carga de la clase

    // Hay un caso en el que puede haber .class que ya no están en el código fuente y es cuando
    // tocamos el código
    // fuente ANTES de cargar y eliminamos algún .java,
    // al cargar como no existe el archivo no lo relacionamos con los .class
    // La solución sería en tiempo de carga forzar una carga de todas las clases y de ahí deducir
    // todos los
    // .class que deben existir (excepto las clases locales
    // que no podríamos detectarlas), pero el que haya .class sobrantes antiguos no es gran
    // problema.

    File classFilePath =
        ClassDescriptor.getAbsoluteClassFilePathFromClassNameAndClassPath(
            sourceFile.getClassName(), folderClasses);
    File parentDir = JProxyUtil.getParentDir(classFilePath);
    String[] fileNameList =
        parentDir.list(); // Es más ligero que listFiles() que crea File por cada resultado
    if (fileNameList != null) // Si es null es que el directorio no está creado
    {
      for (String fileName : fileNameList) {
        int pos = fileName.lastIndexOf(".class");
        if (pos == -1) {
          continue;
        }
        String simpleClassName = fileName.substring(0, pos);
        if (sourceFile.getSimpleClassName().equals(simpleClassName)
            || sourceFile.isInnerClass(sourceFile.getPackageName() + simpleClassName)) {
          new File(parentDir, fileName).delete();
        }
      }
    }
  }