SYNTHETIC = kód generovaný překladačem, BRIDGE metoda = překladačem generovaná metoda pro přístup k proměnné či metodě, která má být přístupná podle pravidel jazyka Java, ale není přístupná na úrovni JVM; je to použito např. u metod pro přístup k privátním položkám vnořené třídy nebo při kovariantním návratovém typu
BRIDGE metody jsou potřeba z toho důvodu, že JVM má pouze top-level třídy. Tj. když zkompiluješ vnitřní či vnořenou třídu, pro JVM to bude top-level třída.
Příkladem syntetického kódu, který není bridge metodou, je syntetický konstruktor ve vnořené třídě, která má deklarovaný pouze privátní konstruktor. Podle pravidel jazyka Java lze totiž privátní konstruktor ve vnořené třídě volat z vnější třídy. Na úrovni JVM jsou ovšem vnější a vnitřní třída dvě obyčejné třídy.
Jak funguje, kdyz mam treba:
private TridaA a = new TridaA();
jako field
konkretne mi jde o to new TridaA();
protoze class ma jen konstant pool, tak to se jako prida par radku do konstruktoru s inicializaci toho fieldu a? A co kdyz je vice konstruktoru?
Ja to resil tak, ze jsem si vygeneroval novou metodu <init2> a ta se volala v kazdem konstruktoru - ale to mi prijde jako neoptimalni reseni
Ano, je to ta druha moznost. Ono to i dava smysl, kdyz budeme (s trochou nadsazky) povazovat rozhrani za ciste abstraktni tridy. Konkretne to vypada nasledovne:
interface InterfaceA {} interface InterfaceB {} interface InterfaceC extends InterfaceA, InterfaceB {}
se v pripade InterfaceC prelozi jako:
Class name is stored in constant pool #0 Class 7 InterfaceC Super class name is stored in constant pool #1 Class 8 java/lang/Object Number of implemented interfaces: 2 Class 9 InterfaceA Class 10 InterfaceB Number of declared fields: 0 Number of declared methods: 0