Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Ucitavaci klasa u javi

[es] :: Java :: Ucitavaci klasa u javi

[ Pregleda: 1841 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

glamoc

Član broj: 125620
Poruke: 346
195.178.35.*



+1 Profil

icon Ucitavaci klasa u javi05.10.2009. u 18:56 - pre 177 meseci
Citao sam nesto o ucitavacu klasa u javi,i ostale su mi neke nedoumice.Nije mi jasno da li se za svaki paket u javi pravi poseban ucitavac
koji ucitane klase stavlja u posebne name space-ove,posto sam tamo procitao da svaki ucitavac ima neki svoj prostor imena i da imena klasa unutar tog prostora moraju biti jedinstvena i da klase van tog prostora ne mogu koristiti klase unutar tog prostora.Interesuje me neka situacija u kojoj je programer prinudjen da pise ucitavac klasa
Kad covjeka napusti Sunce njegovog zavicaja ko ce mu posvijetliti na putu povratka
 
Odgovor na temu

Huemaj

Član broj: 115981
Poruke: 25
*.public.t-mobile.at.



+5 Profil

icon Re: Ucitavaci klasa u javi24.10.2009. u 09:15 - pre 176 meseci
Pozdrav,

Kada bi npr. sve klase bile ucitavane od jednog ucitavaca, svaka klasa bi imala pristup ka sve i jednog drugoj klasi unutar JVM. To nije pozeljno ako
zelis da zastitis odredjene third-party klase. Osim toga, podjela klasa u tzv. namespace omogucava izbjegavanje konflikta izmedju jednakih imena klasa.
Da bi dvije klase bile jednake, nije dovoljno da imaju isto puno (kvalifikovano) ime, vec je potrebno da budu ucitane od istog ucitavaca. Znaci vazi slijedece:

Code:

   MyClassLoader cl1 = new MyClassLoader();
   Object o1 = cl1.loadClasss("net.MyClass").newInstance();
   Object o2 = cl1.loadClasss("net.MyClass").newInstance();
   System.out.println(o1.getClass() == o2.getClass()); // true

   MyClassLoader cl2 = new MyClassLoader();
   o2 = cl2.loadClasss("net.MyClass").newInstance();
   System.out.println(o1.getClass() == o2.getClass()); // false



Najbolji primjer za to kada treba da se pise vlastiti ClassLoader je dinamicko ucitavanja klasa sa lokacija koje nisu unaprijed poznate. Tvoj standardni
System- ili Application ClassLoader trazi klase samo na mjestima koja su naznacena u CLASSPATH-u. Zamisli da pises aplikaciju koja 'on the fly' generise
java klase i memorise ih u folderu koji moze biti proizvoljno izabran od korisnika. U tom slucaju moras imati ClassLoader koji ucitava klase iz tog foldera.
Takodjer, zamisli da jednu te istu klasu zelis vise puta da ucitas, znaci imas razlicite verzije jedne te iste klase (recimo editujes klasu i kompilujes je i
ucitavas vise puta bez da restartujes JVM, npr. kod Tomcat-a) - ako bi htio da ucitas jednu te istu klasu sa istim CL-om, dobices Exception da je klasa
vec ucitana. Jedino rijesenje da ucitas klasu sa drugim CL-om (pri tome se misli na drugu instancu ClassLoader objekta -> new ...).
Kao sto znas klase se mogu ucitavati i preko neta; zamisli da pises aplikaciju koja ucitava klase sa odredjenog mjesta na netu, znaci zelis imati ClassLoader
kojem mozes da kazes sa kojeg URL-a da doneses klasu, itd...

Eclipse je odlican primjer koriscenja vlastitih ClassLoader-a. Kada pises klase u Eclipse IDE, tvoje klase se automatski kompiliraju i odlazu na odredjenom
mjestu unutar Eclipse-Workspace-a. Da bi Eclipse mogao naci te klase kad startujes svoju aplikaciju, potrebno je da ima ClassLoader-e koji ce traziti
klase u odredjenim subfolderima unutar workspace-a.

Prednost ovakvog pristupa je recimo i taj da mozes da startujes dvije java aplikacije unutar jedne JVM. Mozda prednost nije u prvi mah ocigledna, ali ako
se podsjetimo da staticke variable odredjene klase vrijede za citavu JVM, imacemo nerijesivi problem ako zelimo da startujemo dvije aplikacije unutar
jedne JVM sa razlicitim vrijednostima statickih varijabli jedne te iste klase. Jos jednom, ne treba zaboraviti da su dvije klase tek onda jednake kad su
njihova imena jednaka i kad su ucitane od istog loadera.

Ako budes pisao aplikacije koje treba dinamicki da generisu klase i ucitavaju ih sa raznih mjesta koja nisu naznacena u CLASSPATH-u, moraces da
pises vlastiti ClassLoader, tada ce ti biti mnogo jasnije o cemu se radi.

Nadam se da sam ti pomogao da steknes uvid u prednosti tzv. custom ClassLoaders :)

[Ovu poruku je menjao Huemaj dana 24.10.2009. u 10:25 GMT+1]
 
Odgovor na temu

[es] :: Java :: Ucitavaci klasa u javi

[ Pregleda: 1841 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.