In che modo è possibile creare campi sintetici in Java?Come creare campi sintetici in java?
È possibile creare campi sintetici in java solo in fase di esecuzione? In caso contrario: C'è un modo standard-compliant a questo al momento della compilazione (senza modificare alcuni byte nel file di classe)
risposta
Sono creati dal compilatore quando "stranezze" del linguaggio li richiedono. Un semplice esempio di questo utilizza una classe interna:
public class Test
{
class Inner
{
}
}
La classe Test.Inner
avrà un campo sintetico per rappresentare l'istanza appropriata della classe Test
.
Possiamo estendere questo codice un po 'per dimostrare che 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 il mio compilatore, che le stampe:
this$0: true
Sì, è fattibile, e si chiama load-time tessitura. Essenzialmente, dovrai definire il tuo ClassLoader che deciderà su un caso classe per classe se modificare un file di classe che deve essere caricato; ciò significa che dovrai ispezionare la classe binaria che viene caricata, eventualmente modificarla, quindi passarla alla JVM per definizione/risoluzione. È un po 'macchinoso, complicato e soggetto a ClassCastExceptions (la stessa classe definita in 2 diversi classloader darà 2 classi diverse che non sono compatibili con l'assegnazione).
Si noti che la tessitura consente di fare molto di più: è possibile aggiungere nuovi metodi, interfacce, campi, modificare il codice delle classi esistenti e altro.
Ci sono già degli strumenti che possono aiutarti - vedi ad esempio AspectJ come modifica linguistica completa, o qualcosa come BCEL o javassist che ti permette di scrivere questi strumenti di tessitura.
- 1. Cosa sono i campi sintetici in Java?
- 2. Trova membri sintetici in campi di classe in Scala
- 3. Perché il compilatore Java dovrebbe creare un campo sintetico serialVersionUID?
- 4. Come utilizzare QCoreApplication :: postEvent per iniettare eventi di input sintetici
- 5. Java: campi transitori statici
- 6. Campi generici Java
- 7. Come creare tabelle con campi password in mysql?
- 8. Come ordinare in base a due campi in Java?
- 9. Modifica dei campi finali in Java
- 10. Campi statici su riferimento null in Java
- 11. java hibernate Colonna sconosciuta '' in 'lista campi'
- 12. Come creare Sequenza di Fibonacci in Java
- 13. Come creare un file exe in java
- 14. Come creare array JSON in Java
- 15. come creare MongoDB IDOggetto in java
- 16. Come creare fluidamente JSON in Java?
- 17. come creare GUID in Java EE
- 18. Come creare annotazioni personalizzate in java?
- 19. Come creare Java Thread Dump in Android?
- 20. Come creare combinazioni di valori in Java?
- 21. Come creare una classe dinamicamente in java
- 22. Come creare un processo in Java
- 23. Come creare Kafka ZKStringSerializer in Java?
- 24. Come creare un proxy in java
- 25. Come creare un file zip in Java
- 26. Come creare un oggetto BLOB in java?
- 27. Come creare un ArrayList 2D in java?
- 28. Come creare un'applicazione java swing in intelijidea
- 29. Sovrascrivi campi classe Java astratti
- 30. Come aggirare la mancanza di campi astratti in Java?
Perché si desidera creare manualmente un campo sintetico? Questo è un po 'contro la sua specifica, dal momento che dice "è qualcosa che il compilatore ha fatto per abilitare un comportamento specifico". Qualsiasi cosa tu voglia fare manualmente dovrebbe essere visibile all'esterno come tale. – perdian