Sé que esta pregunta es ahora casi tres años, pero me parece que una parte de la pregunta sigue sin respuesta:
Y: ¿significa que la clase B ya no es privada ¿en tiempo de ejecución?
comentario Carlos Heubergers en skaffmans respuesta sugiere, clase B
sigue siendo private
para otras clases del paquete.
Probablemente sea adecuado para el lenguaje de programación Java, es decir, no es posible hacer referencia a la clase B
de otra clase. Al menos no sin usar el reflejo (con el cual también se puede acceder a miembros privados de la clase desde el exterior), pero este es otro problema.
Pero como la JVM no tiene ningún concepto de una clase interna (como dice skaffman), me pregunté cómo se logra una visibilidad "accesible por una sola clase" en el nivel de bytecode. La respuesta: no se realiza en absoluto, para la JVM la clase interna parece una clase privada de paquete normal. Esto es, si escribe bytecode para usted (o modifica uno generado por el compilador) puede acceder a la clase B
sin problemas.
Puede acceder a todos los métodos de acceso sintético de todas las clases en el mismo paquete, también. Por lo tanto, si asigna un valor a un campo privado de la clase A
en un método de la clase B
, se genera un método de acceso sintético con visibilidad predeterminada (es decir, paquete privado) en la clase A
(llamado algo como access$000
) que establece el valor para usted. Se supone que este método solo debe invocarse desde la clase B
(y, de hecho, solo se puede invocar desde allí utilizando el lenguaje Java).Pero desde el punto de vista de JVM, este es solo un método como cualquier otro y puede ser llamado por cualquier clase.
lo tanto, para responder a la pregunta:
- Desde el punto de vista de idiomas de Java, la clase es
B
y se mantiene privado.
- Desde el punto de vista de las JVM, la clase
B
(o mejor: clase A$B
) no es privada.
OK, lo veo. Para mí esto significa que evitaré el uso de clases internas como en el ejemplo, solo puede generar confusión. – Gerard
No dejaría que te moleste. Esa advertencia particular del compilador no es muy útil para nadie, los métodos sintéticos se usan todo el tiempo con las clases internas y no tienen un impacto significativo. – skaffman
En mi humilde opinión, los métodos sintéticos eran una adición innecesaria al idioma. El solo uso del alcance del paquete para los miembros "privados" (que el compilador hace de todos modos) fue una solución satisfactoria. – finnw