¿Cómo se pueden crear campos sintéticos en Java?¿Cómo crear campos sintéticos en Java?
¿Pueden los campos sintéticos en Java solo crearse en tiempo de ejecución? Si no es así: ¿Hay una manera compatible con el estándar a este en tiempo de compilación (sin cambiar algunos bytes en el archivo de clase)
Respuesta
Son creados por el compilador cuando "rarezas" de la lengua lo requieran. Un ejemplo sencillo de esto es usar una clase interna:
public class Test
{
class Inner
{
}
}
La clase Test.Inner
tendrá un campo sintético para representar a la instancia apropiada de la clase Test
.
Podemos extender este código ligeramente para mostrar ese campo:
import java.lang.reflect.*;
public class Test
{
public static void main(String[] args)
{
for (Field field : Inner.class.getDeclaredFields())
{
System.out.println(field.getName() + ": " + field.isSynthetic());
}
}
class Inner
{
}
}
Con mi compilador, que las impresiones:
this$0: true
Sí, es factible, y que se llama en tiempo de carga de tejido. Básicamente, necesitará definir su propio ClassLoader que decidirá en un caso de clase por clase si modifica un archivo de clase que está por cargarse; eso significa que tendrá que inspeccionar la clase binaria que se está cargando, posiblemente modificarla, y luego pasarla a la JVM para su definición/resolución. Es un poco engorroso, complicado y propenso a ClassCastExceptions (la misma clase definida en 2 cargadores de clases diferentes dará 2 clases diferentes que no son compatibles con la asignación).
Tenga en cuenta que tejer le permite hacer mucho más: puede agregar nuevos métodos, interfaces, campos, modificar el código de clases existentes, y más.
Ya hay herramientas que pueden ayudarlo: vea por ejemplo AspectJ como una modificación completa del lenguaje, o algo así como BCEL o javassist que le permite escribir tales herramientas de tejido.
- 1. Cómo utilizar QCoreApplication :: postEvent para inyectar eventos sintéticos de entrada
- 2. Cómo crear nuevos campos para el cliente
- 3. Cómo crear campos de formulario JSF dinámicos
- 4. Crear campos opcionales en el registro Clojure?
- 5. Cómo crear proxy en java
- 6. ¿Herencia de campos finales en Java?
- 7. Copie campos entre clases similares en java
- 8. Java: campos transitorios estáticos
- 9. Cómo crear campos PDF editables en un informe de Jasper
- 10. ¿Cómo crear tablas con campos de contraseña en mysql?
- 11. ¿Cómo puedo crear un polígono usando campos en PostgreSQL?
- 12. Modificación de campos finales en Java
- 13. Java delimitada limitaciones genéricas en los campos
- 14. Ocultar campos en herencia de Java
- 15. ¿Cómo evitar la falta de campos abstractos en Java?
- 16. Cómo insertar eventos de mouse sintéticos en la cola de entrada X11
- 17. Cómo crear una matriz JSON en Java
- 18. ¿Cómo crear una ontología en Java?
- 19. Cómo crear un proceso en Java
- 20. Cómo crear una anotación personalizada en java?
- 21. ¿Cómo crear excepciones personalizadas en Java?
- 22. ¿Cómo crear una carpeta en Java?
- 23. ¿Cómo crear una carpeta vacía en java?
- 24. Cómo crear una clase dinámicamente en Java
- 25. cómo crear GUID en Java EE
- 26. Cómo crear un archivo exe en java
- 27. ¿Cómo crear un singleton verdadero en java?
- 28. ¿Cómo crear pestañas verticales en Java?
- 29. ¿Es posible agregar campos adicionales en Crear usuario en Liferay
- 30. Crear oyentes personalizados en Java
¿Por qué le gustaría crear un campo sintético manualmente? Eso está en contra de su especificación, ya que dice "eso es algo que el compilador ha hecho para habilitar algún comportamiento específico". Todo lo que quieras hacer manualmente debería ser visible desde el exterior como tal. – perdian