Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Xwinus 13. 01. 2013, 17:52:22

Název: Jak překrýt třídu JVM
Přispěvatel: Xwinus 13. 01. 2013, 17:52:22
Zdravím,
pokud bych potřeboval nahradit nějakou standartní třídu JVM, např javax.swing.JFrame za vlastní, jak donutím JVM aby používal mojí verzi javax.swing.JFrame a ne defaultní? Potřebuji to udělat bez zásahu do vlastního JVM, kvůli přenositelnosti.
Díky
Název: Re:Jak překrýt třídu JVM
Přispěvatel: student 13. 01. 2013, 18:02:39
Nepojde to cez vlastny ClassLoader?
Název: Re:Jak překrýt třídu JVM
Přispěvatel: Logik 13. 01. 2013, 19:34:42
http://stackoverflow.com/questions/4838301/how-to-overwrite-classes-from-jdk
Název: Re:Jak překrýt třídu JVM
Přispěvatel: mif 13. 01. 2013, 19:40:01
Overridovat triedu z JVm je v 99.9% pripadov zly pristup, vzhladom na to ze nevies anglicky a ani hladat na google, by som povedal ze sa snazis o nieco velmi zle premyslene.
Kazdpopadne vela stastia, ja by som to spravil tak ze by som si prekopiroval zdrojak tej classy, zmenil a skompiloval a vlozil to do rt.jar v JRE.
Název: Re:Jak překrýt třídu JVM
Přispěvatel: Xwinus 13. 01. 2013, 19:54:53
Overridovat triedu z JVm je v 99.9% pripadov zly pristup, vzhladom na to ze nevies anglicky a ani hladat na google, by som povedal ze sa snazis o nieco velmi zle premyslene.
Kazdpopadne vela stastia, ja by som to spravil tak ze by som si prekopiroval zdrojak tej classy, zmenil a skompiloval a vlozil to do rt.jar v JRE.

Ne, nemám v úmyslu nic jiného než zkusit něco provést s třídou XTrayIconPeer.IconCanvas, jejíž metoda paint() může za tak úžasný vzhled pozadí tray icon v Linuxu
Název: Re:Jak překrýt třídu JVM
Přispěvatel: smajdak 14. 01. 2013, 01:15:44
Ne, nemám v úmyslu nic jiného než zkusit něco provést s třídou XTrayIconPeer.IconCanvas, jejíž metoda paint() může za tak úžasný vzhled pozadí tray icon v Linuxu

Copak to nejde podědit a překrýt? :O
Název: Re:Jak překrýt třídu JVM
Přispěvatel: alef0 14. 01. 2013, 03:34:02
Abandon sanity, ye who enter!

Obavam sa, ze to je neriesitelne a jednoduche prekrytie fungovat nebude, kedze je to trieda sun.awt.X11.XTrayIconPeer$IconCanvas, kde sa vobec nepredpoklada, ze to bude vyvojar. Je to inak znamy bug [1] od roku 2006, oprava zrejme v Java 8.

To naozaj smrdi kompilovanim celej platformy: ani si nechcem predstavit, ze ake sialene zavislosti su tam nasekane. (Nebodaj este AWT a jeho integracia s nativnymi ovladacimi prvkami...) To bez ohladu na to, ci sa skompiluje len jedna trieda alebo cele rt.jar.

Ak sa to aj podari, tak sa pripravte na veselice s bootclasspath u vsetkych ludi, kde to ma bezat, co je nastavenie mimo schopnosti bezneho pouzivatela.

[1] http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6453521
Název: Re:Jak překrýt třídu JVM
Přispěvatel: Xwinus 14. 01. 2013, 09:19:10
Abandon sanity, ye who enter!

Obavam sa, ze to je neriesitelne a jednoduche prekrytie fungovat nebude, kedze je to trieda sun.awt.X11.XTrayIconPeer$IconCanvas, kde sa vobec nepredpoklada, ze to bude vyvojar. Je to inak znamy bug [1] od roku 2006, oprava zrejme v Java 8.

To naozaj smrdi kompilovanim celej platformy: ani si nechcem predstavit, ze ake sialene zavislosti su tam nasekane. (Nebodaj este AWT a jeho integracia s nativnymi ovladacimi prvkami...) To bez ohladu na to, ci sa skompiluje len jedna trieda alebo cele rt.jar.

Ak sa to aj podari, tak sa pripravte na veselice s bootclasspath u vsetkych ludi, kde to ma bezat, co je nastavenie mimo schopnosti bezneho pouzivatela.

[1] http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6453521

V tomhle nejsem odborník, ale co jsem pochopil, kdybych svojí třídu načetl před tou systémovou z rt.jar, použila by se ta moje, že? Nebylo by tedy možné a jednodušší nějak upravit ClassLoader aby nejdříve načetl ty moje? Jen pro zajímavost, našel jsem zajímavý způsob patchování tříd za běhu: http://armoredbarista.blogspot.cz/2012/01/patching-java-at-runtime.html (http://armoredbarista.blogspot.cz/2012/01/patching-java-at-runtime.html)
Název: Re:Jak překrýt třídu JVM
Přispěvatel: Pavel Tisnovsky 14. 01. 2013, 11:31:02
Zdravím,
pokud bych potřeboval nahradit nějakou standartní třídu JVM, např javax.swing.JFrame za vlastní, jak donutím JVM aby používal mojí verzi javax.swing.JFrame a ne defaultní? Potřebuji to udělat bez zásahu do vlastního JVM, kvůli přenositelnosti.
Díky

Pres volbu xbootclasspath (se vsemi riziky :-)
Název: Re:Jak překrýt třídu JVM
Přispěvatel: Pavel Tisnovsky 14. 01. 2013, 11:34:00
Abandon sanity, ye who enter!

Obavam sa, ze to je neriesitelne a jednoduche prekrytie fungovat nebude, kedze je to trieda sun.awt.X11.XTrayIconPeer$IconCanvas, kde sa vobec nepredpoklada, ze to bude vyvojar. Je to inak znamy bug [1] od roku 2006, oprava zrejme v Java 8.

To naozaj smrdi kompilovanim celej platformy: ani si nechcem predstavit, ze ake sialene zavislosti su tam nasekane. (Nebodaj este AWT a jeho integracia s nativnymi ovladacimi prvkami...) To bez ohladu na to, ci sa skompiluje len jedna trieda alebo cele rt.jar.

Ak sa to aj podari, tak sa pripravte na veselice s bootclasspath u vsetkych ludi, kde to ma bezat, co je nastavenie mimo schopnosti bezneho pouzivatela.

[1] http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6453521

Ve skutecnosti neni build OpenJDK zase tak hroznej, zavislosti jsou, ale jen na beznych devel knihovnach. Viz http://icedtea.classpath.org/wiki/Main_Page#Quickstart_.26_Building a http://icedtea.classpath.org/wiki/BuildRequirements