Por curiosidad, ¿por qué a veces se generan múltiples archivos .class de Java para una clase después de la compilación? Por ejemplo, mi aplicación tiene seis clases. Para una clase, se han generado un total de 10 archivos .class, comenzando desde MyClass # 1 hasta MyClass # 10.Múltiples archivos .class generados para una clase?
Respuesta
Estos son para inner classes y static nested classes. Los que tienen números son clases internas anónimas.
Por ejemplo:
class Foo {
class Bar { }
static class Baz { }
void run() {
Helper t = new Helper() {
int helpMethod() {
return 2;
}
};
}
}
Esto producirá archivos de clase Foo.class
, Foo$Bar.class
, Foo$Baz.class
y Foo$1.class
(para la implementación de la interfaz Helper
)
Un archivo fuente de Java puede generar múltiples archivos de clase, si tu clase contiene clases internas Las clases internas anónimas están representadas por los archivos de clase numerados.
Cada clase en java pertenece a un archivo .java, pero un archivo .java puede contener múltiples clases. Eso incluye clases internas y anónimas. Los archivos .class generados para clases internas contienen un '$' en su nombre. Las clases internas anónimas obtienen números.
Se generará más de una clase en la compilación, solo si su clase tiene clase interna.
se refieren: Why does Java code with an inner class generates a third SomeClass$1.class file?
Bueno, un archivo fuente también puede contener clases separadas, no anidadas (si no son públicas). –
no SOLO si tiene clases internas (también hay clases anónimas, clases anidadas, ...). –
Usted obtiene más fils .class desde un único archivo de origen si
la clase contiene las clases internas o clases internas estáticas. Las clases internas pueden anidar. Sus nombres son
<outer class name>$<inner class name>
.interfaces internas que son siempre estáticas.
clases anónimas internas (que en realidad son las clases internas lisas sin nombre) interfaces de acceso
paquete y clases antes y después de su clase principal. Puede tener un número arbitrario de clases e interfaces de acceso a paquetes en un solo archivo fuente Java. Por lo general, los pequeños objetos auxiliares que solo utiliza la clase se colocan en el mismo archivo.
Para añadir a las respuestas anteriores, este es otro buen ejemplo de las clases internas generadas en base a comparadores (cada comparador se compila en una diferente MiClase $ X.class):
public class MyClass {
...
public void doSomething() {
...
Collections.sort(list, new Comparator<MyObj>() {
public int compare(MyObj o1, MyObj o2) {
...
}
});
...
}
...
}
Si hay un archivo X.java y si contiene 4 collections.sort() {} luego de la compilación X.class, X $ 1.class, X $ 2.class, X $ 3.class, X $ 4.class se generará
En el caso de la clase interna y la clase interna estática se generan más archivos .class.
- 1. Eclipse - Mostrar archivos de clase generados
- 2. Findbugs excluye archivos generados
- 3. Inspeccionar mediante programación archivos .class
- 4. Cómo excluir archivos R * .class producido por una acumulación Proguard
- 5. Crear MÚLTIPLES archivos de clase basados en un XSD
- 6. ¿Cómo deshabilitar "advertencia como error" solo para archivos generados? (MSBuild)
- 7. Sirviendo archivos ZIP generados dinámicamente en Django
- 8. Uso de PHPExcel para crear archivos de Excel generados automáticamente
- 9. Como llegar ReSharper para omitir los archivos generados
- 10. ¿Dónde almacena Eclipse los archivos de servlet generados para Tomcat?
- 11. ¿Qué archivos generados por RubyMine debo confirmar?
- 12. ¿Cómo uso AutoMapper para mapear múltiples subclases en una clase?
- 13. Cómo depurar archivos .class en ECLIPSE?
- 14. Android: ¿puedo usar una clase SQLiteOpenHelper para múltiples archivos de base de datos?
- 15. ¿Hay una GUI para diseñar informes PDF generados por Java?
- 16. recuperar el atributo .class de una clase genérica
- 17. SCons depende de los archivos generados en tiempo de compilación
- 18. ¿Cómo puedo abrir archivos .class de Java de una manera legible para los humanos?
- 19. python 3: class "template" (función que devuelve una clase parametrizada)
- 20. ¿Es una buena práctica reemplazar Class with Class <? extiende Object> para evitar advertencias?
- 21. ¿Cómo puedo extraer archivos .class de archivos .jar?
- 22. ¿Es legal extender la clase Class?
- 23. Log4j archivos múltiples
- 24. Comparación de ejecutables generados para la equivalencia
- 25. Forzar Eclipse para importar automáticamente una clase con múltiples opciones
- 26. ¿Cómo se usa una clase SyncAdapter para múltiples autoridades?
- 27. ¿Por qué Java genera varios archivos .class en la compilación?
- 28. Agregar automáticamente archivos fuente generados a un proyecto xcode
- 29. Agregando una anotación a un método/clase generados en tiempo de ejecución usando Javassist
- 30. Múltiples archivos para una sola base de datos SQLite
Terminología: no solo "clases internas", sino que todas las "clases anidadas" se compilan en dichos archivos –
Es cierto - He actualizado la respuesta para que refleje esto –
No se olvide de las clases anónimas. Técnicamente ya están cubiertos por "clases internas", pero no siempre se ven como clases, por lo que la gente puede sorprenderse de verlas aparecer. Además, las nuevas lambdas Java 8 parecen estar generando clases adicionales cuando se compilan. – ArtB