[Java] Class Reloading

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben bezig met een plugin systeem voor een programma dat in een zo goed als oneindige while loop draait. Nu wil ik dat je een plugin kan aanpassen, opnieuw een class file van kan maken, en dat als je dan een command doorgeeft aan het programma die plugin herlaad(dus met de nieuwe class file). Nu heb ik dit:
code:
1
2
3
ArrayList<Plugin> plugins = new ArrayList<Plugin>();
plugins.add((Plugin) Class.forName("jasco.plugins.TestPlugin").newInstance());
plugins.add((Plugin) Class.forName("jasco.plugins.AdminPlugin").newInstance());


en zodra je de command aanroept om plugins te herladen dit:
code:
1
2
3
plugins.clear();
plugins.add((Plugin) Class.forName("jasco.plugins.TestPlugin").newInstance());
plugins.add((Plugin) Class.forName("jasco.plugins.AdminPlugin").newInstance());


Dit werkt echter niet(oude code blijft gewoon).
Iedere keer als er iets gebeurt geeft het programma een callback aan alle plugins in de arraylist. Dus stel je voor, bij de callback: blaat echoed een plugin: "Hello World!". Dan wil ik dat ik het zo kan aanpassen dat als ik de plugin verander en opnieuwe compile(naar bijvoorbeeld: "Hallo Wereld!") en ik dan de plugins reload er bij de callback blaat "Hallo Wereld!" komt te staan en niet meer "Hello World!"

Is dit mogelijk? Zo ja, hoe?

Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
Ja, dit is mogelijk, echter niet op deze manier. Je zult hiervoor logica moeten bouwen die een class netjes uitlaadt uit het systeem en de nieuwe er weer in zet. Ik heb echter geen flauw idee hoe dat moet, maar waarschijnlijk houdt dit het bouwen van een eigen classloader in.

Gelukkig zijn er mensen die dat wél weten, en die hebben de OSGi alliance opgestart. Je zou kunnen kijken naar een OSGi implementatie zoals Apache Felix. Ik werk zelf ook hele dagen met een CMS die hierop gebaseerd is (met wisselende resultaten, overigens), en qua het dynamisch in- en uitladen van classes (en modules) werkt het meestal wel goed.

[ Voor 5% gewijzigd door YopY op 15-04-2010 14:25 ]


Acties:
  • 0 Henk 'm!

  • CoolGamer
  • Registratie: Mei 2005
  • Laatst online: 06-09 16:59

CoolGamer

What is it? Dragons?

Even Googlen kom ik dit tegen: http://tutorials.jenkov.c...ss-loading-reloading.html
Het kan, maar het is niet makkelijk.

Voor een paar andere voorbeelden: [google=java reload class]

[ Voor 17% gewijzigd door CoolGamer op 15-04-2010 14:30 ]

¸.·´¯`·.¸.·´¯`·.¸><(((º>¸.·´¯`·.¸><(((º>¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸<º)))><¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
TheCoolGamer schreef op donderdag 15 april 2010 @ 14:29:
Even Googlen kom ik dit tegen: http://tutorials.jenkov.c...ss-loading-reloading.html
Het kan, maar het is niet makkelijk.

Voor een paar andere voorbeelden: [google=java reload class]
Ik was die eerste ook al tegengekomen. Eerst lukte die niet, net toch nog maar eens geprobeerd. En het is gewoon gelukt :). Ty all

Acties:
  • 0 Henk 'm!

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 22:40

Nick_S

++?????++ Out of Cheese Error

Ik zou toch nog eens goed kijken naar je opzet en of je niet beter OSGI kan inzetten zoals YopY al aanhaalde. Dat is oa. gemaakt om runtime modules (plugins) te kunnen vervangen. Je gaat denk ik tegen een hele hoop problemen oplopen, welke al opgelost zijn met OSGI.

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nick_S schreef op donderdag 15 april 2010 @ 15:55:
Ik zou toch nog eens goed kijken naar je opzet en of je niet beter OSGI kan inzetten zoals YopY al aanhaalde. Dat is oa. gemaakt om runtime modules (plugins) te kunnen vervangen. Je gaat denk ik tegen een hele hoop problemen oplopen, welke al opgelost zijn met OSGI.
Ik loop tot nu toe tegen geen problemen aan. En het mooiste is: het is nu heel makkelijk om in te stellen dat ie sommige plugins van 't internet laad. Weet niet of dat met OSGI ook zo is? Ik wil iig zoveel mogelijk zelf doen/source zien

Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Om te leren/zelf te ontdekken wat de problemen zijn is natuurlijk prima, maar met OSGi krijg je een mooie start met een uitgedacht systeem.

Heb je bijvoorbeeld al bedacht hoe je omgaat met klasses/objecten die de code gebruiken die je uit de lucht haalt en weer in de lucht brengt? Hoe je om wilt gaan met plugins die afhangen van een bepaalde versie van een andere plugin (terwijl er ook nog een nieuwere/oudere versie van die plugin in het systeem aanwezig kan/moet zijn)? OSGi wel...

De meeste OSGi implementaties (o.m. Apache Felix, Eclipse Equinox, Knopflerfish) zijn overigens Open Source, dus de source code bestuderen kan altijd.

[ Voor 21% gewijzigd door Herko_ter_Horst op 15-04-2010 22:28 ]

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

  • r5d
  • Registratie: Februari 2002
  • Niet online

r5d

Read more, write less...

Verwijderd schreef op donderdag 15 april 2010 @ 17:47:
Ik wil iig zoveel mogelijk zelf doen/source zien
Als studie/hobby project is dat uiteraard prima, maar voor een serieus project zou ik toch eens naar OSGi kijken (zoals reeds aangehaald). Zoveel mogelijk zelf doen is in veel gevallen een anti-pattern ;) OSGi is in essentie zeer lightweight, laat het consortium en alle tooling, frameworks, etc er om heen je niet afschikken.

[ Voor 7% gewijzigd door r5d op 15-04-2010 22:26 ]

Later betaal je meer, maar dan heb je wel een gratis datalimiet....

Pagina: 1