Jak překrýt třídu JVM

Xwinus

Jak překrýt třídu JVM
« kdy: 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


student

Re:Jak překrýt třídu JVM
« Odpověď #1 kdy: 13. 01. 2013, 18:02:39 »
Nepojde to cez vlastny ClassLoader?


mif

Re:Jak překrýt třídu JVM
« Odpověď #3 kdy: 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.

Xwinus

Re:Jak překrýt třídu JVM
« Odpověď #4 kdy: 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


smajdak

Re:Jak překrýt třídu JVM
« Odpověď #5 kdy: 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

alef0

Re:Jak překrýt třídu JVM
« Odpověď #6 kdy: 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

Xwinus

Re:Jak překrýt třídu JVM
« Odpověď #7 kdy: 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

Pavel Tisnovsky

Re:Jak překrýt třídu JVM
« Odpověď #8 kdy: 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 :-)

Pavel Tisnovsky

Re:Jak překrýt třídu JVM
« Odpověď #9 kdy: 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