2010-07-21 13 views
7
  1. ¿Cómo se pueden crear campos sintéticos en Java?¿Cómo crear campos sintéticos en Java?

  2. ¿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)

+2

¿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

Respuesta

14

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 
3

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.

Cuestiones relacionadas