dinamikus class letrehozas reflectionnel?

Fórumok

udv,

elmondom roviden a gondomat.
van egy A osztalyom, amiben van egy olyan, hogy

List<B>

, B -ben pedig egy

List<A>

-m (N:N kapcsolat van kozottuk)

ha ezt szeretnem WSbol visszaadni, a JAXB nem tudja jol serializalni, mert korkoros referencia miatt vegtelen ciklusba fut. (nem, egyelore nem akarok XStreamet
hasznalni)

most azt csinalom, hogy letrehoztam egy ATransferObject -et, ami a

List<B>

helyett egy

List<Integer>

-t tartalmazm, amiben a B objektumok idi talalhatoak.
(ezek biztos nem nullok)
namost soksok osztalynal ez nagyon korulmenyes munka, raadasul a regieket is mindig karban kell tartanom ha ott valtozik vmi.

kitaltaltam, hogy mi lenne, ha sajat annotaciokat bevezetnek, es irnek egy osztaly-gyarto eljarast, ami az annotaciok alapjan reflection segitsegevel
letrehoz egy uj osztalyt.

hogy csinaljam? :) az annotacios resz kesz, reflectiont tudom hasznalni, csak nem tudom hogy tudnek uj osztalyt letrehozni.

es legyszi, ne azt mondjatok, hogy egy stringbe rakjam ossze, es azt etessem meg a class loaderrel.. :)

Hozzászólások

Én úgy tudom, hogy a class létrehozás reflectiönnel még a 6-os Javának sem része (.NET-ben azt hiszem van ilyen szolgáltatás).

Amit lehet csinálni, hogy Java kódot gyártasz, amit fordítóval lefordítasz és a keletkezett class-t betöltöd. Erre két megoldást tudok elképzelni:
- Régebben hallottam, hogy valamelyik verziótól kezdve erre lesz API. Ennek utánajárhatsz hátha a 6-osban már van.
- Használhatod az ecj Eclipse compilert, ami egyetlen önjáró jar-ként letölthető és elég jól dokumentált, hogy hogy kell használni.

Azonban én inkább azt javasolnám, hogy valahogy máshogy oldd meg a problémát, ne kódgenerálással :-)!

J2EE kornyezetben a kulso fordito hivogatasa nem jarhato ut, es nemis tul elegans.
nem kodot akarok generalni, classt akarok epiteni. :) nagy kulonbseg.

primitiv megoldasi otletem van, de az nem olyan szep. [csinaljunk egy fix osztalyt, amiben map van,
es reflectionnel mar feltudjuk tolteni adatokkal egy ilyen class peldanyat]

Lehet, hogy rosszul értem a problémád, de nem arról van szó, hogy van egy N:N kapcsolat, amit serializalni akarsz, de az oda-vissza referencia miatt nem tudsz?

Ha ezek kölcsönös referenciák, akkor nem lehetne azt megcsinálni, hogy az egyik osztály esetén transient List-et használnál, és a deserializáció (de csúnya ez így leírva ;) ) után a másik alapján visszaállítod a referenciákat?

++1

Nem fogsz tudni class-t létrehozni a VM-ben, legalábbis ilyesmi nem része a szabványnak. A reflection-el is csak vizsgálni/használni tudod a meglévő és lefordított osztályokat. Ld pl. hogy a reflection nem támogatja a genericeket, hiszen futásidőben type erasure van érvényben.
Ha körkörös referenciáid vannak, akkor az vagy design error, vagy pedig tranziens/redundáns referencia (azaz olyan, amelyik nem esszenciális, de pl. lehetőv teszi az O(1) elérését egy olyan objektumnak, amit máskülönben mindig meg kéne keresni valamilyen listából). Utóbbi esetben transient kulcsszó elé, és deszerializáláskor vissza kell állítani.

--
The Net is indeed vast and infinite...
http://gablog.eu

miert ne lehetne korkoros referencia? ugy utalom mikor nulla alappal dobaloznak az emberek olyan szavakkal, hogy "design error".

mondjuk vannak filmjeid, meg vannak kategoriaid. ha A film tartozik a horror kategoriaba, akkor Aban van egy ref a kategoria megfelelo entitatasara, es visszafele is. olvasgass egy kis ORM theoryt.

az eredeti postra: nem teszem tranziensse, mert az adatbazisban teljesen jo ha bennevan, es _nagyon_ workaround szagu a dolog. nem tehetek rola, hogy idiotak csinaltak a JAX-WS -t.

amugy a topic mar targytalan, van ra megoldas, a classloader leszarmazottjaban osszelehet hozni mindenfele ugyesseget asmel is, de en talaltam jobbat, ebbol fogok diplomamunkat irni. :)

[a transient nem tiszta megoldas, bidirekcios referenciak teljesen elfogadottak, ne dobalozzatok mar a design errorral. a masik meg, hogy akarhonnan nezve az objektummodellt sokkal tisztabb, ha ilyenek vannak. az asmel es az apache projekttel [bcel vagy ilyesmi a neve] az a baj, hogy nagyonnagyon korulmenyes komolyabb munkara.

van ra jobb megoldas, ha elkeszul a diplomamunka, kidobom pdfbe]

"ugy utalom mikor nulla alappal dobaloznak"

Plz. olvasd már el hogy mit írtam...

design error _VAGY_ (!!!) redundáns referencia

Ha az előbbi lenne, akkor sem mondtam, hogy a te hibád, lehet h más csinálta és neked ezzel kell 1üttélni.
Ha az utóbbi akkor írtam megoldást rá. Én kérek elnézést, hogy segíteni próbáltam.

--
The Net is indeed vast and infinite...
http://gablog.eu

nincs azzal semmi baj, ha segiteni probaltal, sot, koszonom :)
csak sokan jottek mostanaban ilyen design error uzikkel, es eddig nem derult ki h en kurtam el, es neha mar elegem van belole :)

amugy csak akkor redundans, ha az egesz objektum-grafot nezed: barmelyik oldalrol szemlelve is csak egy sima referencia. :)
igy egyszerubb kezelni.

Egy nagyon egyszerű oka van: csak így tudták megoldani, hogy a genericessé tegyék az API-t (főleg a konténereket), ugyanakkor minden kód visszafelé kompatibilis maradjon a genericeket megelőző időből. Minden generic mögött ugyanúgy objectekkel/casttal operál, csakhogy már fordítási időben lehet a kód helyességét ellenőrizni.
Nehezen tudna mit kezdeni a type infókkal egy korábbi class loader.

--
The Net is indeed vast and infinite...
http://gablog.eu

ez jo, egy nagy gond van vele, hogy ugye megkell mondanom mire hivatkozok, ami a teljes objektumgraf szerializacioval jar, ami nem szerencses parmillio rekordnal. gondolj egy dvds webboltra, ha van a filmben hivatkozas a kategoriara, abban pedig parezer film, akkor leszerizaljuk azokat is..? :-)