Java i refleksija
Pravim neki (kao) DB ORM za SQLite (prvenstveno da bih naučio nešto) pa imam sledeću situaciju:
1) (Apstraktna) Klasa SQLiteORM 2) Korisnik iz nje nasledi svoju klasu: Class MojObj extends SQLiteORM i definiše ime tabele i custom funkcije, relacije etc... 3) Kad korisnik u kodu ima: Kôd:
MojObj obj = new MojObj(); Međutim, kod za f-ju get() je u klasi SQLiteORM tako da verujem da meni ustvari treba refleksija jer pravim nove instance objekta izvedene klase. Može neki primer refleksije, tj. kako iz koda natklase (mada je to ustvari objekat potklase, ali ja pišem taj kod u mojoj natklasi) napraviti objekat potklase i pročitati/upisati neka (public, možda neka budu i static, polja), odnosno pozvati neku funkciju? Da li je ovo uopšte moguće uraditi? U PHP-u je moguće jer on nije toliko striktan sa tipovima kao Java npr. |
Našao sam dobar dokument na ovu temu ovde: http://java.sun.com/developer/techni...LT/Reflection/
Pogledaću pa ću se valjda snaći :) |
Pripazi samo kad praviš tu factory metodu na činjenicu da parent klasa ne bi smela da bude svesna postojanja konkretne potklase. BTW, ako već praviš ORM da bi nešto naučio, Java je prilično loš izbor.
Nego, nisam siguran da ti je za to o čemu pričaš neophodna refleksija: Kôd:
abstract class ModelBase { |
Ustvari lupam, da bi kreirao instance moraćeš da koristiš refleksiju.
|
Citat:
Osim što su među najpoznatijim ORM alatima oni koji rade na Javi, kao npr. Hibernate. Sa Javom kvalitetnih ORM biblioteka sigurno ne nedostaje, većina open source, a u praksi se koriste za zaista mission-critical aplikacije već dugo vremena. Čini mi se i da je ActiveRecord upravo prvo dobio ime i opisan od strane M. Fowlera u njegovoj knjizi Patterns of Ent. Applications, sa primerima u.. Javi i C#-u. |
@Nemanja: imaš negde žešći problem sa tim što želiš da uradiš, u samom dizajnu (ideji, zamisli) čitave stvari, jer parent klasa ne bi tebala da poziva funkcije u child klasi..
Negde si pobrkao malo stvari. Citat:
Kôd:
MojObj obj = new MojObj(); Kôd:
public static List<MojObj> get(parametri bla bla) Kôd:
List<MojObj> lista = MojObj.get(bla bla); Kôd:
for( MojObj obj : lista ) |
^ Fora je upravo da instanciranje ne bude u izvedenoj klasi jer bi ta metoda onda glasila potpuno isto u svim izvedenim klasama, osim tog poziva "new MojObj". Zato mu i treba refleksija, da bi dodavanje novog modela moglo da se svodi na "praznu" klasu koja nasleđuje BaseModel. A refleksija je u Javi i C# znatno zapetljanija nego u dinamičkim jezicima.
A glede flejma, nisam ni rekao da u Java ekosistemu nema kvalitetnog softvera (štaviše), već da ima efikasnijih jezika za učenje kako se prave ORM-ovi. |
Ehej, polako sa flejmom, naši smo :)
Kao prvo, krenuo sam da radim neke Android aplikacije u Javi pa me smara rad sa bazama, odnosno hteo bih više da se fokusiram na funkcionalnost aplikacije a ne na pisanje SQL-a i pisanje 20 redova koda svaki put kad treba nešto da vučem iz baze. A kako mi je diplomski rad na temu programiranja Android aplikacija verujem da ću raditi još nešto osim tog diplomskog pa reko' da spojim lepo i korisno :D Drugo, u PHP-u radim sa CodeIgniterom i nekim ORM-om za njega po imenu Datamapper, i iskreno dosta mi se svidelo kako to radi, pa samo pokušavam da napravim nešto slično za Javu (Android) i SQLite, samo ne toliko korisno (čitaj: kompleksno), bar ne za sad. Dalje, osnovna klasa ne zna za, i ne poziva metode izvedene klase, jer se u izvedenoj klasi nalaze samo metode koje su potrebne za "rad" konkretnog modela (npr. klasa "Radnik", kad smo već krenuli sa tim, treba da ima metodu "izracunajPlatu" ili tako nešto, lupam sad) i osnovna klasa nema potrebe uopšte da ih poziva. Osnovna klasa nikad ne treba (i ne sme) da poziva metode izvedene klase, to mi je jasno i potpuno logično jer osnovna klasa i ne zna da postoje izvedene klase i koje metode u njima postoje. Fora je što kad izvedena klasa pozove get() koja je u osnovnoj klasi, ta metoda (get) treba preko this.getClass().getName() da vidi ime izvedene klase, i preko refleksije da napravi i vrati objekat te klase, da bi korisnik u vraćenom objektu, pored podataka iz baze, imao i pristup metodama izvedene klase. |
A da probas nesto da uradis sa genericima. npr. get<T>()
|
^Upravo to gledam. Moze, mozda.. samo malo :)
Za C# bi moglo, pri cemu samo dodas generics constraint class bazna { List<T> get<T>(bla bla) where T : bazna, new() { } } I onda unutar get<T> imas dostupno sve sto definise bazna klasa a vracas objekte tipa T (izvedena). E sad nisam dugo radio sa Javom, nisam siguran kako bi tamo odradio ove generics constrainte, da li je moguce uopste. U C# bi onda jednostavno imao: var izvedena = new Izvedena(); var lista = izvedena.get<Izvedena>(bal bal) i dobijes nazad iz bazne klase list<Izvedena>. |
Vreme je GMT +2. Trenutno vreme je 21:48. |
Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.