Internet Info, s.r.o. Lupa Měšec Podnikatel Root Zdroják DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

Názory k článku
Pohled pod kapotu JVM (4.část - dokončení popisu struktury souborů .class)

Vít Šesták (v6ak) aura:79
3. 1. 2012 8:59 Nový

ACC_BRIDGE vs. ACC_SYNTHETIC

celé vlákno

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.

Zdeněk Troníček
Zdeněk Troníček (neregistrovaný) ---.sh.cvut.cz
7. 1. 2012 9:48 Nový

Re: ACC_BRIDGE vs. ACC_SYNTHETIC

celé vlákno

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.

Vít Šesták (v6ak) aura:79
7. 1. 2012 11:12 Nový

Re: ACC_BRIDGE vs. ACC_SYNTHETIC

celé vlákno

Aha, takže část metod, o kterých jsem si myslel, že jsou syntetické, jsou bridges. Díky.

Pavel Tišnovský aura:98
7. 1. 2012 14:04 Nový

Re: ACC_BRIDGE vs. ACC_SYNTHETIC

celé vlákno

Preji 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).

Filip
Filip (neregistrovaný) ---.net.upcbroadband.cz
3. 1. 2012 12:36 Nový

init fieldu tridy

celé vlákno

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

Vít Šesták (v6ak) aura:79
3. 1. 2012 12:51 Nový

Re: init fieldu tridy

celé vlákno

To se kopíruje do každého konstruktoru, skoro bych řekl, že to následuje ihned po volání konstruktoru rodičovské třídy.

Pavel Tišnovský aura:98
7. 1. 2012 14:07 Nový

Re: init fieldu tridy

celé vlákno

Mohu se zeptat, jestli mate na mysli staticke fieldy (platne pro tridu) nebo fieldy prislusne k objektu (instanci tridy)?

Vít Šesták (v6ak) aura:79
7. 1. 2012 14:11 Nový

Re: init fieldu tridy

celé vlákno

Kdyby š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.

Pavel Tišnovský aura:98
7. 1. 2012 20:09 Nový

Re: init fieldu tridy

celé vlákno

Presne, prave proto se pro jistotu ptam (i kdyz ten princip je vlastne skoro stejny).

Karel Novotný
9. 1. 2012 17:26 Nový

interface MyInterface extends MyInt1, MyInt2

celé vlákno

Jak 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í) ?

Pavel Tišnovský aura:98
9. 1. 2012 22:32 Nový

Re: interface MyInterface extends MyInt1, MyInt2

celé vlákno

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
Zasílat nově přidané příspěvky e-mailem