Java tabela modifikatora pristupa. Modifikatori pristupa. Zadani modifikator pristupa je da se ne koriste ključne riječi

Koje dodajete tokom inicijalizacije da biste promijenili vrijednosti. Java jezik ima širok spektar modifikatora, a glavni su:

  • modifikatori pristupa;
  • modifikatori klase, metode, varijable i niti koji se koriste u nepristupne svrhe.

Da biste koristili modifikator u Javi, morate uključiti njegovu ključnu riječ u definiciju klase, metode ili varijable. Modifikator mora biti ispred ostatka naredbe, kao što je prikazano u sljedećim primjerima:

Javna klasa className ( // ... ) private boolean myFlag; statičke finalne duple sedmice = 9,5; zaštićeni statički konačni int BOXWIDTH = 42; public static void main (String argumenti) ( // tijelo metode)

Modifikatori pristupa

Java pruža brojne modifikatore pristupa za specificiranje nivoa pristupa za klase, varijable, metode i konstruktore. Postoje četiri pristupa:

  • Vidljivo u paketu (ovo je zadano i nije potreban modifikator).
  • Vidljivo samo razredu (privatno).
  • Vidljivo svima (javno).
  • Vidljivo za paket i sve podklase (zaštićene).

Zadani modifikator pristupa - bez ključne riječi

Zadani modifikator pristupa- znači da ne deklariramo eksplicitno modifikator pristupa u Javi za klasu, polje, metod, itd.

Varijabla ili metoda deklarirana bez modifikatora kontrole pristupa dostupna je bilo kojoj drugoj klasi u istom paketu. Polja u interfejsu su implicitno javna, statična, konačna, a metode u interfejsu su po defaultu javne.

Primjer

Varijable i metode se mogu deklarirati u Javi bez ikakvih modifikatora, kao što je prikazano u sljedećem primjeru:

Verzija niza = "1.5.1"; boolean processOrder() (vrati true;)

Modifikator privatnog pristupa

Modifikator privatno- metodama, varijablama i konstruktorima koji su deklarirani privatnim u Javi može se pristupiti samo unutar same deklarirane klase.

Modifikator privatnog pristupa je najrestriktivniji nivo pristupa. Klasa i interfejsi ne mogu biti privatni.

Varijablama koje su deklarirane kao privatne može se pristupiti izvan klase ako su javne metode koje ih primaju prisutne u klasi (pogledajte primjer i objašnjenje ispod).

Korišćenje privatnog modifikatora u Javi je glavni način za skrivanje podataka.

Primjer

Sljedeća klasa koristi privatnu kontrolu pristupa:

Javna klasa Logger (privatni string format; javni string getFormat() (vrati this.format; ) public void setFormat(String format) ( this.format = format; ) )

Ovdje varijabla formatu klasa Logger je privatan, tako da ne postoji način da druge klase direktno dobiju i postave njegovu vrijednost.

Da bi ova varijabla bila dostupna svima, definirali smo dvije javne metode: getFormat() koji vraća vrijednost formatu, And setFormat(String), koji postavlja njegovu vrijednost.

modifikator javnog pristupa

javni modifikator- klasa, metod, konstruktor, interfejs, itd. deklariranom kao javnom može se pristupiti iz bilo koje druge klase. Prema tome, poljima, metodama, blokovima deklariranim unutar javne klase može se pristupiti iz bilo koje klase koja pripada Java “univerzumu”.

Međutim, ako pokušamo pristupiti javnoj klasi u drugom paketu, onda javna klasa mora biti uvezena.

Zahvaljujući nasljeđivanju klasa, u Javi, sve javne metode i varijable klase nasljeđuju njene podklase.

Primjer

Sljedeća funkcija koristi kontrolu javnog pristupa:

Javni statički void main(String argumenti) ( // ... )

Metoda main() mora biti javna. Inače, ne može se pozvati pomoću java interpretera za pokretanje klase.

Modifikator pristupa zaštićen

Modifikator zaštićen- Varijablama, metodama i konstruktorima koji su deklarisani zaštićeni u superklasi mogu pristupiti samo podklase u drugom paketu ili bilo koja klasa u paketu zaštićene klase.

Modifikator zaštićenog pristupa u Javi ne može se primijeniti na klasu i sučelja. Metode i polja se mogu proglasiti zaštićenima, ali metode i polja u interfejsu se ne mogu proglasiti zaštićenima.

Zaštićeni pristup daje podklasi mogućnost da koristi pomoćnu metodu ili promenljivu, sprečavajući nepovezanu klasu da pokuša da je koristi.

Primjer

Sljedeća roditeljska klasa koristi zaštićenu kontrolu pristupa tako da će njena podređena klasa nadjačati metodu openSpeaker():

Class AudioPlayer ( zaštićeni boolean openSpeaker(Speaker sp) ( // detalji implementacije) ) klasa StreamingAudioPlayer ( boolean openSpeaker(Speaker sp) ( // detalji implementacije) )

Štaviše, ako definiramo metodu openSpeaker() kao zaštićen, tada neće biti dostupan ni iz jedne druge klase osim AudioPlayer-a. Ako ga definiramo kao javan, onda će postati dostupan svima. Ali naša namjera je da ovu metodu izložimo samo podklasi, zato smo koristili zaštićeni modifikator.

Kontrola pristupa i pravila nasljeđivanja

Sljedeća pravila u Javi primjenjuju se na naslijeđene metode:

  • Metode deklarirane kao javne u superklasi također moraju biti javne u svim potklasama.
  • Metode deklarirane zaštićenima u superklasi moraju biti ili zaštićene ili javne u potklasama; ne mogu biti privatni.
  • Metode proglašene privatnim ne nasljeđuju svi, tako da za njih ne postoji pravilo.

Modifikatori klasa, metoda, varijabli i niti koji se koriste u svrhe nepristupa

Java pruža brojne modifikatore ne za pristup, već za implementaciju mnogih drugih funkcionalnosti:

  • modifikator statički koristi se za kreiranje metoda i varijabli klasa;
  • modifikator final koristi se za završetak implementacije klasa, metoda i varijabli;
  • modifikator apstraktno neophodno za kreiranje apstraktnih klasa i metoda;
  • modifikatori sinhronizovano I volatile koristi se u Javi za niti.

Modifikator statički

Modifikator statički- koristi se za kreiranje metoda i varijabli klasa.

statičke varijable

Static ključna riječ se koristi za kreiranje varijabli koje će postojati nezavisno od bilo koje instance kreirane za klasu. Postoji samo jedna kopija statičke varijable u Javi, bez obzira na broj instanci klase.

Statičke varijable su također poznate kao varijable klase. U Javi, lokalne varijable se ne mogu proglasiti statičkim.

statičke metode

Static ključna riječ se koristi za kreiranje metoda koje će postojati nezavisno od bilo koje instance kreirane za klasu.

U Javi, statičke metode ili statičke metode ne koriste nikakve varijable instance nijednog objekta klase, one su definirane. Statičke metode prihvataju sve podatke iz parametara i neki od ovih parametara se izračunavaju bez pozivanja na varijable.

Varijablama i metodama klase može se pristupiti korištenjem imena klase praćenog tačkom i imenom varijable ili metode.

Primjer

Statički modifikator u Javi se koristi za kreiranje metoda klasa i varijabli, kao što je prikazano u sljedećem primjeru:

Javna klasa InstanceCounter (privatni statički int numInstances = 0; zaštićeni statički int getCount() (vrati numInstances; ) privatni statički void addInstance() (numInstances++; )InstanceCounter() (InstanceCounter.addInstance(); ) javni statički argument void main(Str. ) ( System.out.println("Počevši od " + InstanceCounter.getCount() + " instance"); for (int i = 0; i

Dobiće se sljedeći rezultat:

Počevši od 0 instance kreirano je 500 instanci

finalni modifikator

finalni modifikator- koristi se za završetak implementacije klasa, metoda i varijabli.

Konačne varijable

Konačna varijabla se može inicijalizirati samo jednom. Referentna varijabla deklarirana kao konačna nikada se ne može dodijeliti za označavanje drugog objekta.

Međutim, podaci unutar objekta mogu se mijenjati. Dakle, stanje objekta se može promijeniti, ali ne i referenca.

Sa varijablama u Javi, finalni modifikator se često koristi sa static kako bi se napravila konstanta varijable klase.

Primjer

public class Test( final int value = 10; // Ispod su primjeri deklaracija konstanti: public static final int BOXWIDTH = 6; static final String TITLE = "Manager"; public void changeValue(){ value = 12; //будет получена ошибка } } !}

konačne metode

Konačnu metodu ne može nadjačati nijedna podklasa. Kao što je ranije spomenuto, u Javi, finalni modifikator sprječava modificiranje metode od strane podklase.

Glavna namjera da se metoda učini konačnom bila bi da se sadržaj metode ne mijenja uporedo.

Primjer

Deklaracija metode koja koristi završni modifikator u deklaraciji klase prikazana je u sljedećem primjeru:

Public class Test( public final void changeName())( // tijelo metode))

završni razred

Glavna svrha u Javi korištenja klase deklarirane kao final je spriječiti da klasa bude potklasa. Ako je klasa označena kao finalna, tada nijedna klasa ne može naslijediti nijednu funkciju od finalne klase.

Primjer

javni završni test klase ( // tijelo klase)

apstraktni modifikator

apstraktni modifikator- koristi se za kreiranje apstraktnih klasa i metoda.

Sažetak razreda

Apstraktna klasa ne može instancirati. Ako je klasa proglašena apstraktnom, onda je njena jedina svrha da se proširi.

Klasa ne može biti i apstraktna i konačna, jer se konačna klasa ne može proširiti. Ako klasa sadrži apstraktne metode, onda se mora proglasiti apstraktnom. U suprotnom će se generirati greška kompilacije.

Apstraktna klasa može sadržavati i apstraktne metode i regularne.

Primjer

apstraktna klasa Caravan( privatna dvostruka cijena; privatni string model; privatni niz godina; javni apstraktni void goFast(); //apstraktna metoda public apstraktni void changeColor(); )

apstraktna metoda

Apstraktna metoda je metoda deklarirana sa bilo kojom implementacijom. Tijelo metode (implementacija) obezbjeđuje potklasa. Apstraktne metode nikada ne mogu biti konačne ili stroge.

Svaka klasa koja proširuje apstraktnu klasu mora implementirati sve apstraktne metode superklase, osim ako potklasa nije apstraktna klasa.

Ako klasa u Javi sadrži jednu ili više apstraktnih metoda, onda klasa mora biti proglašena apstraktnom. Apstraktna klasa nije obavezna da sadrži apstraktne metode.

Apstraktna metoda završava se tačkom i zarezom. Primjer: javni apstraktni uzorak();

Primjer

javna apstraktna klasa SuperClass( apstraktna void m(); //apstraktna metoda ) klasa SubClass proširuje SuperClass( // implementira apstraktnu metodu void m())( ......... ) )

sinkronizirani modifikator

sinkronizirani modifikator

Synchronized ključna riječ se koristi za označavanje da metodi može pristupiti samo jedna nit u isto vrijeme. U Javi, sinhronizovani modifikator se može primeniti sa bilo kojim od četiri modifikatora nivoa pristupa.

Primjer

public synchronized void showDetails() ( ....... )

Transient modifikator

Varijabla instance označena kao prolazni govori Java virtuelnoj mašini (JVM) da preskoči određenu varijablu prilikom serijalizacije objekta koji je sadrži.

Ovaj modifikator je uključen u naredbu koja kreira varijablu prethodne klase ili tipa podataka varijable.

Primjer

javni prolazni int limit = 55; // neće biti sačuvan public int b; // će biti sačuvan

volatile modifikator

volatile modifikator- koristi se u Javi za niti.

U Javi, volatile modifikator se koristi da JVM zna da nit koja pristupa promenljivoj treba uvek da spoji sopstvenu kopiju varijable sa glavnom kopijom u memoriji.

Pristup promjenljivoj varijabli sinkronizira sve keširane kopirane varijable u RAM. Volatile se može primijeniti samo na varijable instance koje su tipa object ili private. Referenca promjenjivog objekta može biti null.

Primjer

javna klasa MyRunnable implementira Runnable( private volatile boolean active; public void run())( active = true; while (active)( // red 1 // neki kod ovdje) ) public void stop())( active = false; / / red 2 ) )

Obično se run() poziva na jednoj niti (kada prvi put počnete koristiti Runnable u Javi), a stop() se poziva na drugoj niti. Ako linija 1 koristi keširanu aktivnu vrijednost, petlja se ne može zaustaviti dok ne postavite aktivno na false na liniji 2.

U sledećoj lekciji ćemo razgovarati o osnovnim operatorima koji se koriste u jeziku Java. Ovaj odjeljak će vam dati pregled kako ih možete koristiti tokom razvoja aplikacije.

Ovdje ćemo pokušati razmotriti gotovo sve slučajeve korištenja modifikatora pristupa. Jedini izuzetak je njihova upotreba za ugniježđene ( ugniježđen) i interni ( unutrašnji) klase, kao i za interfejse, pošto ove teme još nismo razmatrali.

Klase i paketi koji se koriste zajedno sa modifikatorima pristupa služe kao sredstva za enkapsulaciju, odnosno sredstva za skrivanje detalja implementacije iza jednostavan interfejs.

Modifikatori pristupa mogu se primijeniti i na klase i na njihove članove – polja i metode. Postoje ukupno četiri modifikatora pristupa i predstavljamo ih ovdje kratak opis, onda ćemo svaki detaljnije pogledati.

  • javnosti– bilo koja komponenta deklarirana kao javnosti, dostupnom iz bilo kojeg koda
  • zaštićeno– omogućava pristup komponenti unutar paketa i klasama potomaka
  • privatni– omogućava pristup komponentama unutar klase
  • default(bez ključne riječi) – omogućava pristup komponentama unutar paketa

Nasljedne klase su klase naslijeđene od klase. Još nismo proučavali nasledstvo..

Pristup časovima

Klase najvišeg nivoa su podrazumevano dostupne u paketu u kojem su definisane. Međutim, ako je klasa najviše razine deklarirana kao javnosti, tada je dostupan svuda (ili gdje god je dostupan sam paket). Ograničili smo ovu izjavu na klase najvišeg nivoa jer se klase mogu deklarisati kao članovi drugih klasa. Pošto su ove unutrašnje klase članovi klase, podležu pravilima za kontrolu pristupa članovima klase.

Pristup članovima razreda

Članovi klase su uvijek dostupni unutar tijela klase. Defaultčlanovi klase su također dostupni u paketu u kojem je klasa definirana.

javni modifikator

Za neugniježđenu klasu može se specificirati samo jedna od dvije moguće razine pristupa: specificirana default I javnosti . Kada je klasa deklarirana kao javnosti, on mora da je jedini javnosti klasa deklarirana u datoteci, a ime datoteke mora odgovarati imenu klase.

Kako javnosti klase, polja, metode i konstruktori mogu biti deklarisani.

Modifikator zaštićen

Ovaj modifikator ćemo detaljno pogledati u temi nasljeđivanja klasa. Ako se nasljeđivanje ne koristi, onda ovaj modifikator radi isto kao i zadani modifikator.

Jedino što se sada može ukratko reći je da su komponente deklarirane kao zaštićeno, imaće pristup bilo koji razred za djecu iz bilo kojeg paketa ili bilo koju klasu iz istog paketa.

Kako zaštićeno polja, metode, konstruktori, ugniježđene klase i ugniježđeni interfejsi mogu biti deklarisani.

zaštićeno .

Modifikator privatno

Ovo je najstroži modifikator u smislu ograničenja pristupa. Elementi deklarisani kao privatni dostupno samo unutar iste klase, a ne nikome izvan razreda.

Kako privatni polja, metode, konstruktori, ugniježđene klase i ugniježđeni interfejsi mogu biti deklarisani.

Klase i interfejsi najvišeg nivoa ne mogu se deklarisati kao privatni .

U suštini, modifikatori pristupa su jednostavna tema, ali ćemo se na njih vratiti kasnije. Za sada je to bilo samo poznanstvo. A sad malo vežbe...

Napravio sam klase Mod02.java, DefMod.java, ProMod.java i PrvMod.java koje pripadaju paketu pro.java.pkg002, kao i klasu PubMod.java, koja pripada paketu pro.java.pkg003. Ispod su samo snimke ekrana ovih klasa i rezultat programa:

5

Vidio sam neke rasprave na StackOverflow o ovoj temi, ali ne vidim ništa što bi mi pomoglo da shvatim sljedeću stvar:

Dolazim iz C++ pozadine i in u poslednje vreme Počeo sam da učim Javu. U C++, kada zaštićeno, koristi se samo potklasa koja može pristupiti članu (analogno polju u Javi).

Postoje i "prijateljske" klase u C++ koje mogu imati pristup privatnim/zaštićenim kamerama klase koje pružaju "prijateljstvo". Ovo je pomalo poput modifikatora polja "package" u Javi (podrazumevani modifikator polja), osim što u C++ prijateljstvo daje pristup svim privatnim članovima, ali u Javi, pristup iz klasa u istom paketu je specifičan za polje klase .

Ono što ne mogu da shvatim, pod pretpostavkom da samo želim da odobrim pristup podklasama, je ono što mogu da uradim u C++ tako što proglašavam zaštićene članove u klasi koja ne "daje" prijateljstva.

Ali u Javi ne znam kako to da uradim, pošto korišćenjem modifikatora polja "zaštićeno" - takođe omogućavam pristup svim klasama u paketu. Jedini način da to uradim je da proglasim zaštićeno polje i izolujem klasu u sopstvenom paketu.

Iz ovoga zaključujem da se grupisanje klasa u jedan paket mora vršiti na osnovu "prijateljstva" između klasa. Da li je ovo zaista pokretački faktor u grupisanju paketa?

Još jedna stvar koju ne razumijem, u Javi, pod pretpostavkom da imam dva polja u klasi A: b, c. Želim dati B pristup za b ali ne i za C, ali ne i za b. a za "Svijet" želim da se b, c sakriju. Kako se to može uraditi? Pretpostavljam da bi B, C trebalo da budu u istom paketu kao i A. ali deklarisanjem b, c sa paket sa modifikatorom I dozvoljavam B, C pristup i b i k. Postoji li način u Javi da se to uradi?

Nadamo se nekom objašnjenju po ovom pitanju

11

Bolje pitanje ako vam je manje korisno bilo bi ono uže i konkretnije. Opšte pitanje "sve o privatnosti u Javi i C++ i po čemu se razlikuju" je više nego malo preširoko. Možete li postaviti konkretnije pitanje o konkretnijem problemu? - Yakk 04 mar 15 2015-03-04 16:38:58

  • 4 odgovora
  • sortiranje:

    Aktivnost

2

U C++, kada se koristi zaštita, samo podklasa može pristupiti elementu (analogno polju u Javi).

Specifikatori pristupa su također za funkcije/metode članova, a ne samo za varijable članova.

U C++ postoje i "prijateljske" klase koje mogu imati pristup privatnim/zaštićenim članovima klase, dajući "prijateljstvo". Ovo je malo poput modifikatora polja "package" u Javi (podrazumevani modifikator polja), osim što u C++ prijateljstvo daje pristup svim privatnim članovima, ali u Javi, pristup iz klasa u istom paketu je specifičan za klasu polje.

Ne postoje samo klase prijatelja, već i funkcije.

Istina je da je pristup privatnim dijelovima Jave sličan, ali nije potpuna zamjena. Bolje je reći da ove dvije funkcije imaju podskup probleme koje rešavaju. Postoje problemi koje može riješiti prijatelj ali ne paket-privatno, i obrnuto.

Ono što nisam mogao da shvatim, pod pretpostavkom da samo želim da odobrim pristup podklasama, je ono što mogu da uradim u C++ tako što proglašavam korisnike zaštićenim u klasi koja ne "daje" prijateljstvo.

Ali u Javi, ne znam kako mogu ovo da uradim,

Odgovor: Ne možete.

pošto korišćenjem modifikatora polja "zaštićeno" - takođe omogućavam pristup svim klasama u paketu.

Jedini način koji nalazim je da deklarišem zaštićeno polje i da klasu izolujem u svom paketu.

Tehnički, da. Ali to stvara druge probleme. Vaša klasa više neće moći pristupiti privatnim dijelovima paketa svog prethodnog paketa. Recimo da je vaša BaseClass bila u com.example.one . Premjestit ćete ga na com.example.two. Sada više neće moći pristupiti drugim paketima privatne klase com.example.one.

Da li je ovo zaista pokretački faktor u grupisanju paketa?

Da, Java je dizajnirana na ovaj način. Možete probati boriti se protiv pravila jezika, ali to je izgubljena bitka u bilo kojem programskom jeziku.

Još jedna stvar koju ne razumijem je u Javi, pod pretpostavkom da imam dva polja u klasi A: b, c. Želim dati B pristup za b ali ne i za C, ali ne i za b. a u "Svijetu" želim da se b, c sakriju. Kako se to može uraditi?

Ovo se ne može učiniti na čist način (pod čistim mislim: bez ikakvih hakova koji bi zahtijevali da provjerite stek poziva u vrijeme izvođenja i izbacite izuzetke).

Ako ste zabrinuti zbog ovog scenarija jer razvijate javni API, niskotehnološko rješenje koje obično odlično funkcionira je kreiranje jednog ili više *.internih paketa i jasno dokumentiranje činjenice da se ne bi trebali koristiti u klijentskom kodu.

1

To je gomila pitanja zajedno...

Ali u Javi, ne znam kako to mogu da uradim, pošto korišćenjem modifikatora polja "zaštićeno" - takođe omogućavam pristup svim klasama u paketu.

Zaista, ne postoji način da se omogući pristup samo podklasama, ali ne i klasama u istom paketu. Ovo je bila dizajnerska odluka doneta pre mnogo vekova...

Jedini način da to uradim je da proglasim zaštićeno polje i izolujem ga u vašem paketu.

Ovo je tehnički ispravno, iako će biti od male koristi. Pakovanje klasa namijenjeno je grupiranju povezanih klasa, pri čemu "povezano" znači "klase koje izvode specifičan odnos", odnosno pripadaju istom slučaju upotrebe, pripadaju istom arhitektonskom nivou, u istoj su suštini itd.

Iz ovoga zaključujem da se grupisanje klasa u jedan paket mora vršiti na osnovu "prijateljstva" između klasa. Da li je ovo zaista pokretački faktor u grupisanju paketa?

Vjerujem da sam već odgovorio na ovo u prethodnom pasusu: ambalaža je dizajnirana da grupiše srodne klase prema nekim specifičnim kriterijima.

Za vaše A, B i C klase, na primjer sa atributima:

Mislim da bi B, C trebalo da budu u istom paketu, A. a deklariše b, sa modifikatorom pakovanja dozvolio sam B, C da pristupi i b i k. Postoji li način u Javi da to uradi?

Odgovor je ne, ne postoji jednostavan i čist način da se to uradi. To možete postići nekim hakovima ili naprednijim tehnikama, ali opet, ovo je bio dio odluka koje su programeri jezika doneli davno...

0

Kratak odgovor: ne postoji način da se to uradi.

Ako ste zabrinuti zbog upada od strane klijenata koji ubrizgavaju klasu u paket kako bi dobili neovlašteni pristup, možete premjestiti osjetljivi kod u poseban paket i napraviti paket zapečaćen u tegli na koju ga isporučujete: http://docs.oracle. com/javase/tutorial /deployment/jar/sealman.html

1

Implicitno se pretpostavlja da se sve klase u paketu "poznaju" (jer ih je napisala ista osoba/kompanija/organizacija). Dakle, oni ili ne pristupaju zaštićenim poljima, ili ako imaju, znaju kako to učiniti ispravno.

Klase u istom paketu bi trebalo da budu više povezane jedna s drugom nego što je roditelj s izvedenom klasom, jer bi izvedenu klasu zapravo mogao napisati neko drugi. Stoga su odlučili da je privatna zaštita više ograničena nego što je zaštićena.

Dakle, mislim da ne biste trebali brinuti o tome kako klase u istom paketu mogu pristupiti poljima jedne druge. Generalno, ja jednostavno ne koristim ovu funkciju osim kada pišem iteratore.

Ako imate dva polja, možete im napraviti unutrašnje klase tako da imaju pristup privatnim poljima (opet, logika: ako je klasa unutar druge klase, ona zna za semantiku te klase) i može omogućiti pristup svojim izvedene klase putem sigurnih metoda.

Naravno, možete smisliti složeni protokol za razmjenu tokena kako biste ovo polje učinili dostupnim samo B/C instancama, ali to bi bilo sjajno, a drugi objekt bi i dalje mogao koristiti refleksiju za pristup svim privatnim članovima ako ne nemojte ga onemogućiti putem sigurnosnih politika, što obično nije slučaj, ali opet, sigurnosne politike na kraju odlučuje vlasnik JVM-a.

Dakle, na kraju krajeva, preferirani način da uradite ono što kažete u Javi je da ih ili stavite u isti paket, ili da napišete B i C kao unutrašnje klase A tako da mogu direktno pristupiti privatnim članovima A i izložiti ih izvedenim klasama .

Javna klasa A (javna statička apstraktna klasa B (zaštićena Whatever getWhatever(A a) ( return a.b; ) protected void setWhatever(A a, Whatever value) (a.b = value; ) ) javna statička apstraktna klasa C (zaštićena Whatever getWhatever (A a) ( return a.c; ) protected void setWhatever(A a, Whatever value) (a.c = value; ) ) private Whatever b;

još jednom, uvijek pretpostavljate da klase u istom paketu nikada neće učiniti ništa loše.

Prvo, pogledajmo modifikatore pristupa. Ima ih samo četiri:

  • privatničlanovi klase su dostupni samo unutar klase
  • paket-privatno ili zadano (zadano)članovi klase su vidljivi unutar paketa
  • zaštićenočlanovi klase su dostupni unutar paketa i u klasama potomcima
  • javnostičlanovi razreda su dostupni svima

Tokom nasljeđivanja, moguće je promijeniti modifikatore pristupa prema VIŠE vidljivosti.

Konstruktori, metode i polja mogu imati bilo koji modifikator pristupa, ali sa klasama i njihovim blokovima sve nije tako jednostavno. Klasa može biti samo javna ili zadana, i može postojati samo jedna javna klasa u jednoj datoteci. Blok može imati samo jedan modifikator – default.

Modifikatori statički, apstraktni i konačni

Statički

  • Primjenjuje se na unutrašnje klase, metode, varijable i logičke blokove
  • Statičke varijable se inicijaliziraju kada se klasa učita
  • Statičke varijable su iste za sve objekte klase (ista referenca)
  • Statičke metode imaju pristup samo statičkim varijablama
  • Statičkim metodama i varijablama se može pristupiti preko imena klase
  • Statički blokovi se izvršavaju tokom učitavanja klase
  • Nestatičke metode se ne mogu poništiti kao statičke
  • Lokalne varijable se ne mogu deklarisati kao statičke
  • Apstraktne metode ne mogu biti statične
  • Statička polja nisu serijalizovana (samo kada se implementira interfejs koji se može serijalizirati)
  • Samo statičke varijable klase mogu se proslijediti parametriziranom konstruktoru koji se zove preko super(//parameter//) ili this(//parameter//)

Abstract

  • Primjenjuje se samo na metode i klase
  • Apstraktne metode nemaju tijelo metode
  • To je suprotno od finala: konačna klasa se ne može naslijediti, apstraktna klasa mora biti naslijeđena
  • Klasa mora biti proglašena apstraktnom ako:
  1. sadrži najmanje jednu apstraktnu metodu
  2. ne pruža implementaciju naslijeđenih apstraktnih metoda
  3. ne pruža implementaciju metoda interfejsa čiju implementaciju je deklarisao
  4. potrebno je zabraniti kreiranje instanci klase

Final

  • Polja se ne mogu mijenjati, metode su poništene
  • Klase se ne mogu naslijediti
  • Ovaj modifikator se odnosi samo na klase, metode i varijable (takođe lokalne varijable)
  • Argumenti metode označeni kao konačni su samo za čitanje, ako ih pokušate promijeniti, dovest će do greške u kompilaciji
  • Konačne varijable se ne inicijaliziraju po defaultu, moraju im se eksplicitno dodijeliti vrijednost kada su deklarirane ili u konstruktoru, inače će doći do greške pri kompilaciji.
  • Ako konačna varijabla sadrži referencu na objekt, objekt se može modificirati, ali varijabla će se uvijek odnositi na isti objekt
  • Ovo važi i za nizove, jer su nizovi objekti - niz se može menjati, ali varijabla će se uvek odnositi na isti niz
  • Ako je klasa deklarirana kao konačna i apstraktna (međusobno isključiva), pojavit će se greška u kompilaciji
  • Pošto se konačna klasa ne može naslijediti, njene metode se nikada ne mogu nadjačati
Constructor ne može biti statična, apstraktna ili konačna

Modifikatori strictfp, tranzient, volatile, synchronized, native

Strictfp

  • Primjenjuje se na metode i klase
  • Pruža operacije na float i dvostrukim brojevima (pokretni zarez) prema IEEE 754 standardu

Prolazno

  • Primjenjuje se samo na varijable na nivou klase (lokalne varijable se ne mogu deklarirati kao prolazne)
  • Prolazne varijable ne moraju biti konačne ili statične.
  • Prolazne varijable nisu serijalizovane

Nestabilan

  • Koristi se samo sa varijablama
  • Može se koristiti sa statičkim varijablama
  • Ne koristi se sa konačnim varijablama - Vrijednost varijable deklarirane kao volatile, promijenjena od strane jedne niti, mijenja se asinhrono za druge niti
  • Koristi se u višenitnim aplikacijama

Sinhronizovano

  • Primjenjuje se samo na metode ili dijelove metoda
  • Koristi se za kontrolu pristupa važnim dijelovima koda u višenitnim programima

Native

  • Koristi se samo za metode
  • Označava da je metoda napisana u drugom programskom jeziku
  • Klase u Javi koriste mnoge izvorne metode za poboljšanje performansi i pristupa hardveru
  • Možete proslijediti/vratiti Java objekte iz prirodnih metoda
  • Potpis metode mora završiti sa “;”, vitičaste zagrade će uzrokovati grešku kompilacije

Karakteristike u interfejsima

  • Metode su uvijek javne i apstraktne, čak i ako nisu deklarirane
  • Metode ne mogu biti statične, konačne, strictfp, izvorne, privatne, zaštićene
  • Varijable su samo javne statičke konačne, čak i ako nisu deklarirane
  • Varijable ne mogu biti strictfp, izvorne, privatne, zaštićene
  • Može samo proširiti drugi interfejs, ali ne i implementirati interfejs ili klasu.

Hajde da spojimo sve modifikatore:

Klasa

Unutrašnja klasa

Varijabilna

Metoda

Constructor

Logički blok

javnosti

Da

Da

Da

Da

Da

br

zaštićeno

br

Da (osim lokalnih i anonimnih časova)

Da

Da

Da

br

default

Da

Da

Da

Da

Da

privatni

br

Da (osim lokalnih i anonimnih časova)

Da

Da

Da

br

final

Da

Da (i za lokalnu varijablu)

Da

br

br

apstraktno

Da

Da (osim anonimnih časova)

br

Da

br

br

statički

br

Da (osim lokalnih i anonimnih časova)

Da

Da

br

Da

native

br

br

br

Da

br

br

prolazno

br

br

Da

br

br

br

sinhronizovano

br

br

br

Da

br

Da (samo kao dio metode)

volatile

br

br

Da

br

br

br

strictfp

Da

Da

br

Da

br

br

Modifikatorska klasa
Modifikator klasa kodira sve modifikatore,
koristi se u deklaracijama tipa, u obliku
konstante:
APSTRAKT, ZAVRŠNI, INTERFEJS, NATIVNI,
PRIVATNI, ZAŠTIĆENI, JAVNI, STATIČNI,
STROGI, SIBHRONIZOVANI, TRANZIDENTNI,
VOLATILE.
Na svaku od konstanti se odgovara metodom zahtjeva forme
isMod(int modifikator) (ovdje Mod je jedan od gore navedenih
data imena, na primjer, isPublic),
koji vraća true ako je modifikator
mod je prisutan u deklaraciji tipa.

Pogledajmo primjer. Neka bude
deklaracija polja
public static final int s=10;
zatim vrijednost vraćenu metodom
getModifikatori odgovarajućeg objekta
class Polje će izgledati
Modifier.PUBLIC | Modifier.STATIC |
Modifier.FINAL
Pojavljuje se modifikator strictfp
konstanta STRICT.
Metode upita mogu se koristiti u
sljedeći obrazac

Modifier.isPrivate(field.getModifiers());
ovo je ekvivalentno sledećem uslovu
(field.getModifiers()&Modifier.PRIVATE)!=0
Class Field
Klasa Field implementira metode
omogućavajući vam da zatražite informacije o
tip polja, kao i da ga pročitate i postavite
značenje.
Pogledajmo neke metode klase Field
1. getType() – vraća objekt klase
Klasa koja odgovara tipu trenutnog polja.
Na primjer, za polje tipa int dobijamo
int.class.

2. Postavite i dobijete metode – omogućavaju vam čitanje
trenutnu vrijednost polja, kao i postaviti novu.
Pogledajmo primjer:
public static void printField(Object o,
Ime niza) baca
NoSuchFieldException,
IllegalAccessException(
Polje polja = o.getClass().getField(name);
Kratka vrijednost = (Short) field.get(o);
System.out.println(vrijednost);
}
One. get metoda vraća vrijednost po kojoj
odnosi se na odgovarajuće polje ili objekt
ljuska klasa.
Primjer korištenja metode set izgleda ovako:

public static void setField(Object o, String name,
kratka nv) bacanja
NoSuchFieldException,
IllegalAccessException(
Polje polja = o.getClass().getField(name) ;
field.set(o,new Short(nv));
}
Za spremanje nv u polje datog objekta
klase omotača moraju se koristiti.
Postoje i metode forme
getPrimitiveType (npr. getInt) i
setPrimitiveType. Ove metode mogu biti
koristiti za promjenu polja u klasi,
ima primitivni tip. na primjer,
field.setShort(o,nv);

Metoda klasa
Klasa metode znači - dozvoliti primanje
potpune informacije u vezi
deklaracije metoda određene klase,
i ako je potrebno pozvati ove metode
kontekst datih objekata.
Pogledajmo metode klase Method.
1. javna klasa getReturnType() - vraća
objekt Class koji odgovara tipu
vrijednost koju vraća trenutna metoda.
Ako umjesto povratnog ukucajte in
deklaracija metode specificira uslugu
riječ void, dotični metod će se vratiti
void.class objekat.

2. javna klasa getParameterTypes() - vraća

parametri navedeni u oglasu
trenutna metoda. Objekti se unose u niz u
redoslijedom kojim su navedeni parametri
deklaracija metode. Ako metoda nema
parametara, vraća se prazan niz.
3. javna klasa getExceptionTypes() - vraća
niz Class objekata koji odgovaraju tipovima
izuzeci koji su navedeni u rečenici
baca deklaracije tekuće metode. Objekti
se unose u niz onim redom kojim
imena tipova izuzetaka su navedena u
deklaracija metode.

4. javni poziv objekta (Object onThis, Object args)
baca IllegalAccessException,
IllegalArgumentException,
InvocationTargetException
Poziva metodu definisanu trenutnim objektom
Metoda, u kontekstu objekta onThis sa zadatkom
vrijednosti argumenata koje prosljeđuje niz args.
Za nestatičke metode, odabir implementacije
izvedeno na osnovu stvarnog tipa
objekt definiran parametrom onThis. Za
statičke metode onThis nisu prihvaćene u
pažnje i može biti nula.
Dužina niza args mora odgovarati broju
parametri u deklaraciji metode, a tipovi objekata elemenata niza moraju dozvoliti dodjelu
odgovarajući tipovi parametara metode - in
inače će biti izbačen izuzetak
IIlegalArgumentException.

10.

Ako, kao dio definiranog objekta
onThis parametar, bez tipa, član
koja je trenutna metoda,
baca se izuzetak
IllegalArgumentException.
Ako je onThis null, a metoda nije
statički, izbacuje se izuzetak tipa
NullPointerException.
Ako je izvršenje pozvane metode
nenormalno završava, baca se
izuzetak tipa InvocationTargetException.

11.

Pogledajmo primjer. Pozovimo putem
metoda refleksije return str.indexOf(".", 8)
onda imamo
probaj (
Klasa strClass = str.getClass();
Metoda indexM = strClass.getMethod("indexOf",
nova klasa(string.class, int.class));
Rezultat objekta = indexM.invoke(str, novi objekat (
".", novi broj (8)));
return ((Integer) result).intValue();
}
uhvatiti (NoSuchMethodException e) ( …….. )
catch (invocationTargetException e) (……..)
uhvatiti (illegalAccessException e) (……)

12.

Konstruktorska klasa
Za kreiranje novih instanci (objekata)
može se koristiti metoda tipa
nova instanca objekta Class,
koji odgovaraju ovom tipu.
Metoda poziva konstruktor bez argumenata,
koji pripada tipu i vraća referencu
na novokreirani objekt klase Object,
u koje se mora eksplicitno konvertovati
traženi tip.
Pogledajmo primjer.

13.

static double testData = ( 0.3,1.3e-2, 7.9, 3.17 );

probaj (
for(int arg = 0; arg< args.length; arg++){
Ime niza = args;
Class classFor = Class.forName(name);
SortDouble sorter =
(SortDouble)classFor.newInstance();
SortMetrics metrics = sorter.sort(testData);
System.out.println(name + ": " + metrics);
for(int i =0; i< testData.length; i++)
System.out.println(“ " + testData[i]); ) )
catch(Izuzetak e) ( System.err.println(e); ) )

14.

newlnstance metoda ako je netačna
aplikacija je sposobna izbaciti velike
broj različitih objekata izuzetaka
vrste.
InstantiationException - ako klasa, objekat
koji se mora stvoriti ne posjeduje
konstruktor bez argumenata, ili
definisano kao apstraktno, ili u
je zapravo interfejs
ili izvođenje postupka kreiranja
objekat je prekinut iz nekog drugog razloga
razlozi.
IllegalAccessException - ako je klasa bilo koji
konstruktori bez argumenata nisu dostupni.

15.

SecurityException - ako je politika na snazi
sigurnost zabranjuje stvaranje novih objekata
ExceptionInInitializerError – baca se kada
inicijalizacija klase.
Klasa Constructor također definira druge metode.
javna klasa getParameterTypes()

koji odgovaraju tipovima parametara koji
su specificirani u deklaraciji trenutnog konstruktora.
javna klasa getExceptionTypes()
Vraća niz objekata klase,
koji odgovaraju tipovima izuzetaka koji
specificirano u klauzuli throws deklaracije
trenutni konstruktor.

16.

javni objekt newlnstance (args objekta)
baca InstantiationException,
IllegalAccessException,
IllegalArgumentException,
InvocationTargetException
Koristi konstruktor predstavljen trenutnim
objekt konstruktora za kreiranje i inicijalizaciju
nova instanca klase u kojoj je konstruktor
deklarisano, prenoseći date argumente.
Vraća vezu na novokreirani i
inicijalizirani objekat. Dužina niza args
mora odgovarati broju parametara u
deklaracija konstruktora, a tipovi objekata elemenata niza moraju dozvoliti dodjelu
odgovarajući tipovi parametara konstruktora -
inače će biti izbačen izuzetak
IllegalArgumentException.

17.

Pogledajmo primjer:
klasa Myclass(
private int a;
public Myclass(int k)(a=k;)
public int func(int a,int b)(return a+b;)
}
javna klasa Main(
public static void main(String args)(
probaj(
String name="Myclass";
Class mycl=Class.forName(name);
Klasa d=(int.class);
Konstruktor c=mycl.getConstructor(d);
Myclass ob=(Myclass)c.newInstance(new Object(
novi Integer(10)));
System.out.println(ob.func(3,5)); )
catch(Izuzetak e)();
}}

18.

AccessibleObject klasa
Klase Polje, Konstruktor i Metode su
izvedeno iz klase AccessibleObject,
što omogućava rješavanje ili
onemogućiti provjeru atributa pristupa nivou
jezicima kao što su javni i privatni.
Klasa AccessibleObject ima metode
1. public void setAccessible (boolean flag)
Postavlja oznaku pristupa objektu na
prema vrijednosti argumenta: istina
znači da objekt više nije podložan
pravila pristupa uspostavljena na nivou
jezik (i uvijek će biti dostupan), lažno
prisiljava objekat da održi dato
nivo pristupa.
Ako ovlaštenje za promjenu oznake pristupa
nije dovoljno, izbacuje se izuzetak tipa
SecurityException

19.

2. javna statičnost
void setAccessible(AccessibleObject array,
boolean zastava)
Omogućava postavljanje oznake pristupa
objekti proslijeđeni kao niz.
Ako je u procesu obrade sljedeća
objekat izbacuje izuzetak tipa
SecurityException, objekti locirani
u prethodnom nizu, spremite novo specificirano
vrijednosti nivoa pristupa i sve ostale
objekti ostaju u istom stanju.
3. public boolean isAccessible()
Vraća trenutnu vrijednost zastavice pristupa
prema objektu

20.

Klasa niza
Klasa Array se koristi za kreiranje niza
sredstva refleksije.
Za kreiranje nizova koriste se dva oblika metode
newInstance.
public Object newlnstance (Class compType, int dužina)
Vraća referencu na novi niz tipa compType
zadata dužina.
public Object newInstance(Class compType, int dim)
Vraća vezu na novu višedimenzionalni niz tip
compType, čije su dimenzije specificirane vrijednostima
elementi niza parametara dim.
Ako je niz dim prazan ili ima dužinu veću od
dozvoljeni broj dimenzija (obično 255),

legalArgumentException.

21.

Pogledajmo primjere.
Primjer 1. Kreirajmo niz tipa bajtova
bajt ba = (bajt)
Array.newlnstance(byte.class,13);
Ovo je ekvivalentno
bajt ba = novi bajt;
Primjer 2.
int dims = (4, 4);
dvostruka matrica =(dvostruka)
Array.newlnstance(double.class, dims);
Ovo je ekvivalentno
dupla matrica = nova dupla;

22.

Klasa Array ima metode get i set.
Neka bude dat niz x vrijednosti tipa int; Onda
izraz xa[i] će odgovarati:
Cijeli broj n=Array.get(xa, i)
Elementu niza možete dodijeliti vrijednost ovako:
xa[i] = 23; - ovo je isto kao
Array.set(xa, i, novi cijeli broj(23));
Klasa paketa
Pozivanje getPackage metode klase Class dozvoljava
dobiti objekt klase Package koji sadrži
opis paketa koji sadrži
klasa (sama klasa Package nalazi se u paketu
java.lang).
Vraća se metoda getName() objekta Package
Puni naziv trenutnog paketa.

23.

Proxy klasa
Proxy klasa vam omogućava da dinamički kreirate
klase koje implementiraju jednu ili više
interfejsi.
Pretpostavimo da postoji klasa A,
implementacija nekih interfejsa.
Java mašina u vreme izvođenja može
generirati proxy klasu za datu
klasa A, tj. vrsta klase koja
implementira sva sučelja klase A, ali
zamjenjuje pozivanje svih ovih metoda
interfejse za pozivanje metode invoke,
InvocationHandler interfejs, za
koje možete odrediti svoje
implementacija.

24.

Proxy klasa se kreira pomoću poziva metode
Proxy.getProxyClass koji uzima ClassLoader i
niz interfejsa i vraća objekat
class java.lang.Class koji je učitan sa
proslijeđen ClassLoader i implementira proslijeđeni niz
interfejsi.
Postoji niz ograničenja za proslijeđene parametre:
1. Svi objekti u nizu interfejsa moraju biti
interfejsi. Ne mogu biti klase ili
primitivcima.
2. Ne mogu postojati dva identična interfejsa u nizu.
objekata.
3. Svi interfejsi u nizu interfejsa moraju biti
učitava ClassLoader koji se prosljeđuje metodi
getProxyClass.
4. Sva nejavna sučelja moraju biti definirana
u istom paketu, inače generisana proxy klasa
neće moći sve da implementira.

25.

5. Ne mogu imati dva interfejsa
metoda sa istim imenom i
potpis parametra, ali sa drugačijim
tipovi povrata.
6. Dužina niza interfejsa je ograničena
65535 interfejsa. Nema Java klase
ne može implementirati više od 65535
interfejsi.

26.

Svojstva dinamičke proxy klase
1. Proxy klasa je javna, pod uvjetom
finalni modifikator i nije apstraktan.
2. Zadano ime proxy klase nije
definiran, ali počinje od Proxy. Sve
imenski prostor koji počinje sa Proxy
rezervirano za proxy klase
(IN najnovije verzije Java nije potrebna).
3. Proxy klasa nasljeđuje od
java.lang.reflect.Proxy.
4. Proxy klasa implementira sva sučelja,
prenijeti po kreiranju, po redoslijedu prijenosa.

27.

5. Ako proxy klasa implementira nejavnu
interfejs, onda će biti generisan u paketu
koji definiše ovaj najnejavniji
interfejs. Općenito, paket u kojem
bit će generirana proxy klasa undefined.
6. Metoda Proxy.isProxyClass vraća true for
klase kreirane pomoću
Proxy.getProxyClass i za klase objekata,
kreiran pomoću Proxy.newProxyInstance i
false inače.
Ovu metodu koristi podsistem
Java sigurnost i to morate razumjeti
klasa jednostavno naslijeđena iz
java.lang.reflect.Proxy će vratiti false.

28.

Svojstva kreirane instance proxy klase su sljedeća:
1. Donosimo objekt klase proxy na sva sučelja,
proslijeđena u nizu interfejsa. Ako je IDemo jedan od
prenesena sučelja, zatim proxy instance operacije
IDemo će uvijek vratiti true, a operativni (IDemo) proxy
završiće ispravno.
2. Statička metoda Proxy.getInvocationHandler
vraća rukovalac poziva prosleđen tokom kreiranja
instanca klase proxy. Ako se prenese na ovo
objekat metoda nije instanca proxy klase, dakle
Izuzetak IllegalArgumentException će biti izbačen.
3. Klasa obrađivača poziva implementira sučelje
InvocationHandler, koji definira metodu pozivanja,
sa sljedećim potpisom:
javni poziv objekta (proxy objekta, metoda metode,
Object args) baca Throwable

29.

Pogledajmo primjer:
paket javaapplication3;
interfejs Račun (
dupli getBalance();
void changeBalance(int sum);
nevažeći postoci (dvostruko po);)
class MyAccount implementira Account(
privatni dvostruki bilans;
javni MyAccount() (balans=0.0; )
javni dupli getBalance() (vrati saldo;)
javna poništena promjena saldo(int suma)(
stanje+=suma;)
postotak javnih praznina (dvostruko po)(
bilans+=bilans*po/100; ); )

30.

klasa MyAccountProxy implementira
InvocationHandler(
privatni račun ac;
javni MyAccountProxy(Account acc)(ac=acc; )
javni statički račun newInstance(Račun da)(
vrati (račun)Proxy.newProxyInstance(
da.getClass().getClassLoader(),
da.getClass().getInterfaces(),
novi MyAccountProxy(da));
}

31.

javni poziv objekta (proxy objekta,
Metoda metode, argumenti objekta)
baca bacanje (
if(method.getName()=="procenti")(
double d=((Double)args).doubleValue();
ako (d<0) d=0;
if(d>30) d=30;
args=new Double(d);

drugo(
return method.invoke(ac, args); )
}
}

32.

javna klasa Main(
public static void main(String args)(
Moj račun ma=novi Moj račun();
Račun
a=(Account)MyAccountProxy.newInstance(ma);
a.changeBalance(150);

a.procenti(20);
System.out.println(a.getBalance());
a.procenti(35);
System.out.println(a.getBalance());) )

33.

Učitavanje klasa
Runtime sistem učitava klase prema potrebi
javlja se potreba za njima.
Funkcionalne karakteristike postupaka učitavanja
klase značajno zavise od
implementacija virtuelne mašine Java, ali u
u većini slučajeva za pronalaženje časova,
adresirana od strane aplikacije, ali nije učitana
Izvršni sistem se koristi mehanizam
pogledajte stazu pretraživanja klase.
Za kreiranje aplikacije koja je u mogućnosti
učitaj klase na druge načine osim
podrazumevano, trebalo bi
koristiti objekat klase ClassLoader,
sposoban da dobije bajt kod implementacije željenog
klase i učitajte je u okruženje za izvršavanje
sistema.

34.

ClassLoader klasa je apstraktna klasa.
Da kreirate svoj vlastiti učitavač klasa,
morate kreirati klasu koja je potomak
ClassLoader i metoda zaobilaženja
protected Class findClass(String name) baca
ClassNotFoundException
Koji pronalazi bajt kod klase sa datom
name name i učitava podatke u okruženje
virtuelna mašina, vraćajući objekat klase,
predstavlja pronađenu klasu.
Objekt loader je sposoban za delegiranje
ovlaštenje za učitavanje klasa u "roditelj"
na učitavač klasa (učitavač roditeljske klase).
Učitavač klase "roditelj" može biti
dat kao argument konstruktoru klase
ClassLoader.

35.

zaštićen ClassLoader()
Kreira objekt ClassLoader, implicitno
koristeći kao "roditelj"
class loader sistemski utovarivač
(koji se može dobiti putem
pozovite metodu getSystemClassLoader).
zaštićeni ClassLoader (ClassLoader roditelj)
Kreira objekt ClassLoader koristeći
specificirani "roditeljski" učitavač klase.
Glavni dio klase ClassLoader
je metoda loadClass

36.

public Class loadClass(String name) baca
ClassNotFoundException
vraća objekt Class za datu klasu
ime i, ako je potrebno, učitava ovo
Klasa. Ako se klasa ne može učitati,
izbacuje se izuzetak tipa
ClassNotFoundException.
Šema opterećenja klase predložena metodom
loadClass je default i obično nije
poništeno, izgleda ovako:
1. provjerite pozivanjem metode
findLoadedClass od ClassLoadera, ne
je li se učitalo? data klasa ranije; kao dio
ClassLoader pruža tabelu objekata
Klasa za sve klase učitane alatima
utovarivač trenutne klase; da je postojao razred
učitano ranije, metoda findLoadedClass
vratit će referencu na postojeći objekt Class;

37.

2. ako klasa nije učitana, poziva se
loadClass "roditeljskog" učitavača
časovi; ako trenutni bootloader nije
ima "roditelja", koristi se
loader sistemske klase;
3. ako klasa još uvijek nije učitana,
metoda findClass se poziva, doing
pretraži i preuzmi klasu.
Stoga je neophodno implementirati
prilagođene verzije sljedećih metoda
ClassLoader:

38.

zaštićena sinkronizirana klasa
loadClass (ime niza, boolean razlučivanje)

zaštićena klasa findClass (naziv niza)
izbacuje ClassNotFoundException
zaštićeni java.net.URL findResource(String name)
zaštićeni java.util.Enumeration
findResources(ime stringa) izbacuje IOException
(Apstraktna klasa ClassLoader predstavlja
samo implementacija metode loadClass
o zaštićenim metodama – findLoadedClass i findClass).

39.

Pogledajmo primjer.
class PlayerLoader proširuje ClassLoader (
public Class findClass(String name) baca
ClassNotFoundException(
probaj (
byte buf = bytesForClass(name);
return defineClass(name, buf, 0, buf.length);
}
uhvatiti (IOException e) (
izbaci novi ClassNotFoundException(e.toString());
}
}
// ...Deklaracije metode bytesForClass i druge
metode
}

40.

Metoda findClass obično radi dvije stvari
funkcije.
Prvo, mora otkriti bajt kod
datu klasu i pohraniti je u niz
tipa byte - ova dužnost u primjeru
dodijeljen metodi bytesForSlass.
Drugo, koristi metodu aplikacije
defineSlass da uradi stvarni
učitavanje klase definisane bajt kodom.
Metoda defineSlass izgleda ovako

41.

zaštićena finalna klasa defineClass(ime stringa,
bajt podataka, int offset, int dužina) baca
ClassFormatError
Vraća objekt Class za klasu sa datim imenom
ime; binarni prikaz klase se prosljeđuje
u obliku niza podataka.
Za učitavanje klase koriste se samo bajtovi,
sadržane u elementima niza podataka sa indeksima
od pomaka do pomaka+dužina. Ako je bajtova od navedenog
praznine ne zadovoljavaju traženi format
opisa klasa, izbacuje se objekat izuzetka
upišite ClassFormatError.
Metoda je odgovorna za pohranjivanje reference na objekt
Klasa za učitanu klasu u učitanoj tabeli
klase tražene metodom findLoadedClass.

42.

Pogledajmo metodu bytesForClass.
zaštićeni bajt bytesForClass(String name) baca
lOException, ClassNotFoundException(
FileInputStream in = null;
probaj (


if (dužina == 0) izbaci novi ClassNotFoundException(name);
bajt buf = novi bajt;

return buf;
}
konačno (
if (in!=null) in.close();
}
}

43.

Dakle puni kod ima oblik:
import java.lang.reflect.*;
import java.io.*;
class MyClassLoader proširuje ClassLoader(
javna klasafindClass(ime stringa) baca
ClassNotFoundException(
bajt buf=ReadFromBuffer(name);
if(name.equals("MyInterface1"))(

) else if(buf==null) (
return findSystemClass(name);
) drugo (
return defineClass(name,buf,0,buf.length);
}
}

44.

zaštićeni bajt ReadFromBuffer(String name) baca
ClassNotFoundException(
FileInputStream in = null;
probaj (
in = novi FileInputStream(name + ".class");
int dužina = in.available(); // broj dostupnih bajtova
if (dužina == 0) baci
novi ClassNotFoundException(name);
bajt buf = novi bajt;
in.read(buf); // Čitanje bajtova
return buf;
}
catch(FileNotFoundException e)(vrati null;)
catch(IOException e)(vrati null;)
konačno (
try( if (in!=null) in.close(); )
uhvatiti (IOException e)( )
}
}

45.

zaštićena sinkronizirana klasa
loadClass(ime stringa,boolean rezolucija) baca
ClassNotFoundException(
Rezultat klase= findClass(name);
if (resolve) resolveClass(result);
vratiti rezultat;
}
}

46.

javna klasa Main1 (
public static void main(String args) (
probaj(
String name="Myclass";
ClassLoader ld=novi MyClassLoader();
Class cl=Class.forName(name, true, ld);
Konstruktor s=cl.getConstructor(int.class);
MyInterface1
ob=(MyInterface1)s.newInstance(
novi Integer(8));
System.out.println(ob.func(3,5));
)catch(Izuzetak e)();
}
}

47.

javni interfejs MyInterface1(
public int func(int a,int b);
}
javna klasa Myclass implementira MyInterface1 (
private int a;
javna Myclass(int k) (a=k; )
public int func(int a,int b)( return a+b; )