2009-06-10 6 views
0

Ich schreibe eine Java-Klasse, die Protokolldateien analysiert. Die kompilierte .class-Datei muss in eine Überwachungsplattform (eG) von Drittanbietern zur Bereitstellung und zum Aufruf geladen werden. Leider erlaubt mir die 3rd-Party-Plattform nur eine einzige .class-Datei hochzuladen.Kann ich anonyme oder innere Klassen in einer einzelnen Java-.class-Datei kompilieren?

Meine aktuelle Implementierung hat eine Funktion, um die 'neueste' Datei in einem Ordner zu finden, der einer Dateimaske (* CJL * .log) entspricht und 2 anonyme Klassen verwendet, eine zum Filtern einer Verzeichnisliste und eine andere zum Sortieren von Liste der Dateien basierend auf ModifiedDt. Wenn ich das kompiliere, bekomme ich 3 .class-Dateien (Monitor.class, Monitor $ 1.class, Monitor $ 2.class), die ich nicht bereitstellen kann.

Ist es möglich, die anonymen Klassen in einer einzelnen .class-Datei für die Bereitstellung auf der Überwachungsplattform von Drittanbietern zu kompilieren?

Ich habe den Code meiner Funktion "Letzte Datei finden" zur Veranschaulichung beigefügt.

private String FindLatestFile(String folderPath) { 
    FilenameFilter filter = new FilenameFilter() { 
     public boolean accept(File dir, String name) { 
      if (name.endsWith(".log") 
        & name.contains("CJL")) 
       return true; 
      else 
       return false; 
     } 
    }; 

    File dir = new File(folderPath); 

    File[] files = dir.listFiles(filter); 

    if (files.length > 0) { 
     Arrays.sort(files, new Comparator<File>() { 
      public int compare(File f1, File f2) { 
       return Long.valueOf(f1.lastModified()).compareTo(
         f2.lastModified()); 
      } 
     }); 

     File newest = files[files.length - 1]; 

     return newest.toString; 
    } else { 
     return ""; 
    } 
} 

Ich nehme an, es möglich ist, mich diese die ‚stumme‘ Art und Weise zu tun, indem Sie eine RAW-Datei immer Auflistung und dabei die Filter/sortieren, aber ich mache mir Sorgen, dies nicht performant sein wird.

Irgendwelche Ideen?

Michael

Antwort

4

Nein es ist nicht möglich, afaik. Ich nehme an, ein Glas kann auch nicht verwendet werden.

Eine Problemumgehung wäre, die Klasse die zwei Schnittstellen implementieren zu lassen, um die Notwendigkeit für die inneren Klassen zu entfernen.

class MyClass implements FilenameFilter, Comparator<File> { 
    ... 

    public boolean accept(File dir, String name) { 
     if (name.endsWith(".log") & name.contains("CJL")) 
       return true; 
     else 
       return false; 
    } 

    public int compare(File f1, File f2) { 
     return Long.valueOf(f1.lastModified()).compareTo(
       f2.lastModified()); 
    } 

    private String FindLatestFile(String folderPath) { 

     File dir = new File(folderPath); 

     File[] files = dir.listFiles(this); 

     if (files.length > 0) { 
      Arrays.sort(files, this); 

      File newest = files[files.length - 1]; 

      return newest.toString; 
     } else { 
      return ""; 
     } 
} 
+0

Aha! Brillant! Daran habe ich überhaupt nicht gedacht. Vielen Dank :) –