Compilação

Pessoal, bom dia.

Quando uma classe.java é compilada, é criado classe.class
Quando uma classe.java possui “subclasses” classes internas a essa classe, é criado classe$arquivoInterno.class, classe$arquivoInterno2.class…
Mas caí em uma situação que não compreendo. Código abaixo.

[code]package davmail.tray;

import davmail.Settings;
import davmail.ui.AboutFrame;
import davmail.ui.SettingsFrame;
import org.apache.log4j.Logger;
import org.apache.log4j.Priority;
import org.apache.log4j.lf5.LF5Appender;
import org.apache.log4j.lf5.LogLevel;
import org.apache.log4j.lf5.viewer.LogBrokerMonitor;

import javax.swing.;
import java.awt.
;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**

  • Tray icon handler based on java 1.6
    */
    public class AwtGatewayTray implements DavGatewayTrayInterface {
    protected AwtGatewayTray() {
    }

    private static TrayIcon trayIcon = null;
    private static Image image = null;
    private static Image image2 = null;
    private static Image inactiveImage = null;
    private boolean isActive = true;

    public Image getFrameIcon() {
    return image;
    }

    public void switchIcon() {
    isActive = true;
    SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    if (trayIcon.getImage() == image) {
    trayIcon.setImage(image2);
    } else {
    trayIcon.setImage(image);
    }
    }
    });
    }

    public void resetIcon() {
    SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    trayIcon.setImage(image);
    }
    });
    }

    public void inactiveIcon() {
    isActive = false;
    SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    trayIcon.setImage(inactiveImage);
    }
    });
    }

    public boolean isActive() {
    return isActive;
    }

    public void displayMessage(final String message, final Priority priority) {
    SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    if (trayIcon != null) {
    TrayIcon.MessageType messageType = null;
    if (priority == Priority.INFO) {
    messageType = TrayIcon.MessageType.INFO;
    } else if (priority == Priority.WARN) {
    messageType = TrayIcon.MessageType.WARNING;
    } else if (priority == Priority.ERROR) {
    messageType = TrayIcon.MessageType.ERROR;
    }
    if (messageType != null) {
    trayIcon.displayMessage(“DavMail gateway”, message, messageType);
    }
    trayIcon.setToolTip(“DavMail gateway \n” + message);
    }
    }
    });
    }

    public void init() {
    SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    createAndShowGUI();
    }
    });
    }

    protected void createAndShowGUI() {
    // set native look and feel
    try {
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch (Exception e) {
    DavGatewayTray.warn(“Unable to set system look and feel”, e);
    }

     // get the SystemTray instance
     SystemTray tray = SystemTray.getSystemTray();
     image = DavGatewayTray.loadImage("tray.png");
     image2 = DavGatewayTray.loadImage("tray.png");
     inactiveImage = DavGatewayTray.loadImage("trayinactive.png");
    
     // create a popup menu
     PopupMenu popup = new PopupMenu();
    
     final AboutFrame aboutFrame = new AboutFrame();
     // create an action settingsListener to listen for settings action executed on the tray icon
     ActionListener aboutListener = new ActionListener() {
         public void actionPerformed(ActionEvent e) {
             aboutFrame.update();
             aboutFrame.setVisible(true);
         }
     };
     // create menu item for the default action
     MenuItem aboutItem = new MenuItem("About...");
     aboutItem.addActionListener(aboutListener);
     popup.add(aboutItem);
    
     final SettingsFrame settingsFrame = new SettingsFrame();
     // create an action settingsListener to listen for settings action executed on the tray icon
     ActionListener settingsListener = new ActionListener() {
         public void actionPerformed(ActionEvent e) {
             settingsFrame.reload();
             settingsFrame.setVisible(true);
         }
     };
     // create menu item for the default action
     MenuItem defaultItem = new MenuItem("Settings...");
     defaultItem.addActionListener(settingsListener);
     popup.add(defaultItem);
    
     MenuItem logItem = new MenuItem("Show logs...");
     logItem.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
             Logger rootLogger = Logger.getRootLogger();
             LF5Appender lf5Appender = (LF5Appender) rootLogger.getAppender("LF5Appender");
             if (lf5Appender == null) {
                 lf5Appender = new LF5Appender(new LogBrokerMonitor(LogLevel.getLog4JLevels()) {
                     protected void closeAfterConfirm() {
                         hide();
                     }
                 });
                 lf5Appender.setName("LF5Appender");
                 rootLogger.addAppender(lf5Appender);
             }
             lf5Appender.getLogBrokerMonitor().show();
         }
     });
     popup.add(logItem);
    
     // create an action exitListener to listen for exit action executed on the tray icon
     ActionListener exitListener = new ActionListener() {
         public void actionPerformed(ActionEvent e) {
             SystemTray.getSystemTray().remove(trayIcon);
             //noinspection CallToSystemExit
             System.exit(0);
         }
     };
     // create menu item for the exit action
     MenuItem exitItem = new MenuItem("Exit");
     exitItem.addActionListener(exitListener);
     popup.add(exitItem);
    
     /// ... add other items
     // construct a TrayIcon
     trayIcon = new TrayIcon(image, "DavMail Gateway", popup);
     // set the TrayIcon properties
     trayIcon.addActionListener(settingsListener);
     // ...
     // add the tray image
     try {
         tray.add(trayIcon);
     } catch (AWTException e) {
         DavGatewayTray.warn("Unable to create tray", e);
     }
    
     // display settings frame on first start
     if (Settings.isFirstStart()) {
         settingsFrame.setVisible(true);
     }
    

    }
    }
    [/code]

Compilando essa classe, é criado AwtGatewayTray.class, AwtGatewayTray$1.class, AwtGatewayTray$2.class …
Alguém saberia me explicar por que? o que leva o compilador a criar esses arquivos?

Agradeço desde já.

SuaClasse$N.class, onde N é um número, denota uma classe anônima. Quando você escreve

        SwingUtilities.invokeLater(new Runnable() {  
            public void run() {  
                if (trayIcon.getImage() == image) {  
                    trayIcon.setImage(image2);  
                } else {  
                    trayIcon.setImage(image);  
                }  
            }  
        }); 

você está criando uma classe anônima que implementa java.lang.Runnable e cujo método run é esse que está entre chaves.