13. 10. 2011. | #1 |
emperor Selassie
Grand Master
|
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(); obj.where('kolona', 'vrednost').get(); 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. |
13. 10. 2011. | #2 |
emperor Selassie
Grand Master
|
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 |
14. 10. 2011. | #3 |
VD IT Direktora
Invented the damn thing
Datum učlanjenja: 08.06.2005
Lokacija: Beograd
Poruke: 2.118
Hvala: 503
1.307 "Hvala" u 282 poruka
|
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 { public abstract String getTableName(); public String get() { return "SELECT * FROM " + getTableName() + ";"; } } class Radnik extends ModelBase { public String getTableName() { return "radnici"; } } class Test { public static void main(String args[]) { ModelBase radnik = new Radnik(); System.out.println(radnik.get()); /* SELECT * FROM radnici; */ } }
__________________
blog Poslednja izmena od jablan : 14. 10. 2011. u 13:18. |
14. 10. 2011. | #5 | |
I'm a PC too.
Wrote a book
Datum učlanjenja: 05.06.2005
Lokacija: Kanada
Poruke: 1.354
Hvala: 82
130 "Hvala" u 89 poruka
|
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.
__________________
Commercial-Free !!! Poslednja izmena od degojs : 14. 10. 2011. u 18:47. |
|
14. 10. 2011. | #6 | |
I'm a PC too.
Wrote a book
Datum učlanjenja: 05.06.2005
Lokacija: Kanada
Poruke: 1.354
Hvala: 82
130 "Hvala" u 89 poruka
|
@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) { List<MojObj> ret = new ArrayList<MojObj>(); ... sada ovde nekako, obično pozivajući funkcije parent klase, dovučeš ono što ti treba i objekte lepo dodaš u tu kolekciju). I onda to vratiš: ... return ret; } Kôd:
List<MojObj> lista = MojObj.get(bla bla); Kôd:
for( MojObj obj : lista ) { obj.Balance = 0; obj.Save(); // verovatno nije potreban Save() na svakom objektu, već na čitavom kontekstu nakon završetka petlje, tj. svih izmena... }
__________________
Commercial-Free !!! Poslednja izmena od degojs : 14. 10. 2011. u 19:15. |
|
14. 10. 2011. | #7 |
VD IT Direktora
Invented the damn thing
Datum učlanjenja: 08.06.2005
Lokacija: Beograd
Poruke: 2.118
Hvala: 503
1.307 "Hvala" u 282 poruka
|
^ 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.
__________________
blog |
"Hvala" jablan za poruku: |
14. 10. 2011. | #8 |
emperor Selassie
Grand Master
|
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 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. |
14. 10. 2011. | #9 |
član
Certified
Datum učlanjenja: 23.02.2009
Poruke: 55
Hvala: 0
11 "Hvala" u 7 poruka
|
A da probas nesto da uradis sa genericima. npr. get<T>()
|
14. 10. 2011. | #10 |
I'm a PC too.
Wrote a book
Datum učlanjenja: 05.06.2005
Lokacija: Kanada
Poruke: 1.354
Hvala: 82
130 "Hvala" u 89 poruka
|
^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>.
__________________
Commercial-Free !!! Poslednja izmena od degojs : 15. 10. 2011. u 00:12. |
Alati teme | |
Način prikaza | |
|
|