2012-07-09 18 views
52

He estado usando Eclipse como IDE mi desarrollo. También lo uso para exportar mi aplicación a un archivo .jar. Cuando miro mis clases en el archivo .jar, algunas de mis clases contienen el nombre de esa clase, un signo de dólar, luego un número. Ejemplo:java clases compiladas contienen signos de dólar

  • Encuentra $ 1.class
  • Encuentra $ 2.class
  • Encuentra $ 3.class
  • Find.class

me he dado cuenta de que hace esto en clases más grandes. ¿Esto es porque las clases son tan grandes que se compila en múltiples clases? Busqué en Google y miré en varios foros, y busqué en la documentación de Java pero no encontré nada relacionado con ella. ¿Alguien podría explicar?

Respuesta

69

Las clases internas, en su caso presente en su clase, serán compilados y el archivo de clase serán ClassName$InnerClassName. En el caso de las clases internas anónimas, aparecerá como números. El tamaño de la clase (código Java) no conduce a la generación de múltiples clases.

E.g. dado este pedazo de código:

public class TestInnerOuterClass { 
    class TestInnerChild{ 

    } 

    Serializable annoymousTest = new Serializable() { 
    }; 
} 

Las clases que se generarán serán:

  1. TestInnerOuterClass.class
  2. TestInnerOuterClass$TestInnerChild.class
  3. TestInnerOuterCasss$1.class

Actualización:

El uso de clases anónimas no se considera una mala práctica, solo depende del uso.

Comprobar this discusión sobre SO

+0

Bien, ¿entonces es malo tener una clase anónima? No entiendo muy bien cómo funciona. Si creo una nueva variable de instancia de una clase en una clase, ¿es una clase anónima? – Frizinator

+0

No, no está mal tener clases anónimas, depende del uso. Actualicé mi publicación – mprabhat

+4

Las entradas que contengan un cuerpo de clase generarán automáticamente una clase interna anónima que amplíe la clase enum y, por lo tanto, genere otro archivo de clase con un $ en él. – dlaidlaw

0

Para responder a su comentario sobre clases son anónimos malas. Definitivamente no lo son. Considere esto a asignar un detector de acción a un JButton:

JButton button = new JButton(...); 
button.addActionListener(new ActionListener() { ... }); 

o esto que ver un caso tipo insensible por la propiedad "name"

Collections.sort(array, new Comparator<Foo>() { 
    public int compare(Foo f1, Foo f2) { 
     return f1.getName().toLowerCase().compareTo(f2.getName().toLowerCase()); 
    } 
}); 

También verá una gran cantidad de Ejecutable y Llamado hecho como clases anónimas.

5

Además de los casos anteriores presentados por @mprabhat, los otros casos podrían ser:

  1. si la clase contiene una enumeración variables una clase separada sería generada por eso también. El nombre de la clase .class generada sería ClassName $ Name_of_enum.
  2. Si su clase X hereda es decir, se extiende otra clase Y, entonces no habría un .class generado con el nombre NombredeClase $ 1.class o NombredeClase $ 1 $ 1.class
  3. Si su clase X está implementando una interfaz y, entonces no habría un .class generado con el nombre NombredeClase $ 1.class o NombredeClase $ 1 $ 1.class.

Estos casos son derivaciones de mi inspección en archivos .class en jar.

+0

Tengo una clase que no cumple ninguno de estos criterios, y class.getName() sigue siendo incorrecta-- para Group.java, devuelve Group _ $$ _ jvst248_20. No tengo idea de lo que está pasando. Definitivamente no enumera, extiende o implementa. – Amalgovinus

Cuestiones relacionadas