Mohu se zeptat, jaký je mezi těmito flagy rozdíl? Zkoušel jsem Google, ale nenašel jsem to. Se synthetic jsem se již setkal, s bridge ne.
Názory k článku
Pohled pod kapotu JVM (4.část - dokončení popisu struktury souborů .class)
Re: ACC_BRIDGE vs. ACC_SYNTHETIC
celé vláknoSYNTHETIC = 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.
Re: ACC_BRIDGE vs. ACC_SYNTHETIC
celé vláknoAha, takže část metod, o kterých jsem si myslel, že jsou syntetické, jsou bridges. Díky.
Re: ACC_BRIDGE vs. ACC_SYNTHETIC
celé vláknoPreji pekny den, priste nebo prespriste zkusim ukazat nejaky priklad na pouziti techto priznaku. Ale muzete si zkusit sam zkompilovat napriklad nejakou aplikaci s GUI, ktera ma par listeneru, ktere meni atributy tridy, v niz jsou vytvoreny (treba jako anonymni tridy).
init fieldu tridy
celé vláknoJak 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
Re: init fieldu tridy
celé vláknoTo se kopíruje do každého konstruktoru, skoro bych řekl, že to následuje ihned po volání konstruktoru rodičovské třídy.
Re: init fieldu tridy
celé vláknoMohu se zeptat, jestli mate na mysli staticke fieldy (platne pro tridu) nebo fieldy prislusne k objektu (instanci tridy)?
Re: init fieldu tridy
celé vláknoKdyby šlo o statické fieldy, tak je asi nebude volat v každém konstruktoru. V jejich případě je to totiž celkem jednoduché, třída má jeden statický "konstruktor" <clinit>. Podle příkladu (private TridaA a = ...) to taky vypadá, že jde o instanční filedy.
Re: init fieldu tridy
celé vláknoPresne, prave proto se pro jistotu ptam (i kdyz ten princip je vlastne skoro stejny).
interface MyInterface extends MyInt1, MyInt2
celé vláknoJak je uloženo v class souboru
interface MyInterface extends MyInt1, MyInt2
když podle všeho umožňuje pouze 1 extends (Jméno třídy a nadtřídy). Nebo je to zapsáno mezi interfacemi (Implementovaná rozhraní) ?
Re: interface MyInterface extends MyInt1, MyInt2
celé vláknoAno, 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

