Comment remplacer les classes dans une application en cours d'exécution en java ?
Dire que j'ai une classe nommée NameGenerator
. Je peux l'utiliser pour générer des noms selon une logique. Puis-je écrire une TestNameGeneration
classe avec une méthode qui demande une lettre de la part de l'utilisateur et génère un nom en conformité. Maintenant, je veux changer la logique dans NameGeneration
de la classe et de l'appliquer particulier de changer sans arrêt de l'application.
Je l'ai fait pour en savoir plus sur la classe chargeurs et quelqu'un peut-il expliquer les concepts clés que je dois apprendre à faire quelque chose comme ça, ou site toutes les références ?
OriginalL'auteur Prasad Weera | 2013-01-14
Vous devez vous connecter pour publier un commentaire.
Ici est une épreuve de travail. Toutes les 5 secondes de Test.main() recharge test.Test1.class à partir du système de fichiers et les appels Test1.bonjour()
L'exécuter. Puis modifier et recompiler Test1
pendant que le Test est en cours d'exécution. Vous verrez Test1.bonjour sortie changé
C'est de cette façon par exemple Tomcat recharge webapps. Il possède un chargeur de classe pour chaque webapp et charge une nouvelle version dans un nouveau chargeur de classe. Le vieux est GCed juste comme n'importe quel objet Java ainsi que les anciennes classes.
Remarque que nous avons chargé Test1 avec TestClassLoader et a invoqué sa première méthode avec la réflexion. Mais tous les Test1 dépendances seront implicitement chargé avec Test1 chargeur de classe, c'est tout le Test1 application sera chargé par la JVM en TestClassLoader.
OriginalL'auteur Evgeniy Dorofeev
Il y a 2 façons:
Espère que cela aide
Merci pour la première suggestion. Mais je ne veux pas utiliser OSGI comme le seul objectif de cette petite application est l'apprentissage de base de la classe java concepts de mise en charge.
OriginalL'auteur Wins
C'est très simple, vous allez utiliser de l'avantage de l'un de la programmation orientée objet et de l'utilisation de l'interface, n'a pas besoin de gérer chargeur de classe
Vous pouvez injecter de la mise en œuvre avec un setter:
Créer une interface, appelée NameGeneration
Créez n mise en œuvre NameGenerationImpl1, NameGenerationimpl2 par exemple
Dans votre client de classe de définir une variable:
et le setter :
nameGeneration va générer ce que vous voulez.
Lorsque vous modifiez l'algorithme de vous modifiez la mise en œuvre en faisant par exemple :
ou
POO
? Je n'ai pas l'obtenir.Je pense qu'il veut dire de la programmation orientée objet...
C'est fondamentalement le modèle de stratégie.
Plonus vous êtes en droit de la POO et mon exemple de l'utilisation de la stratégie de modèle couplé avec injection de dépendance.
OriginalL'auteur Jean-Christophe Blanchard
À propos d'une modèle de stratégie? Il pourrait être une meilleure solution à votre problème plutôt que d'utiliser des chargeurs de classes.
Comme je sais stratégie motif serait aider à choisir entre plusieurs implémentations que nous préférons au moment de l'exécution par le codage d'une interface. Mais nous ne pouvons pas introduire une toute nouvelle mise en œuvre n la volée.
vous pouvez injecter à la volée : voir mon exemple ci-dessus avec le modèle de stratégie et DI: setNameGeneration(de la Classe.forName("com.haricot.ClasseA").newInstance() )
OriginalL'auteur Uwe Plonus
Vous pouvez écrire votre propre classloader personnalisé. Si jamais il y a du changement dans le fichier de classe ou de ressources/jar contenant le fichier de classe (vérifier l'horodatage), détruire la précédente chargeur de classe de l'instance et de créer un nouveau chargeur de classe de l'instance qui va charger le nouveau fichier de classe.
OriginalL'auteur Abhay Yadav