Question

J'écris ma thèse principale, qui traite AOP dans .NET, entre autres, et je mentionner le manque de soutien pour le remplacement des cours à temps de chargement comme un facteur important dans le fait qu'il n'y a actuellement aucune .NET AOP cadres qui effectuent le tissage dynamique vrai - sans imposer. pas l'exigence selon laquelle les classes tissées doivent étendre ContextBoundObject ou MarshalByRefObject ou exposer toute leur sémantique sur une interface

Vous pouvez cependant faire avec Java dans la machine virtuelle Java grâce à ClassFileTransformer:

  • Vous prolongez ClassFileTransformer.
  • Vous êtes abonné à l'événement de charge de la classe.
  • Sur la charge de la classe, vous réécrivez la classe et le remplacer.

Tout cela est très bien, mais mon directeur de projet m'a demandé, tout à fait à la dernière minute, de lui donner une liste des cadres (et les langues associées) qui ne / ne prend pas en charge le remplacement de la classe. Je ne sais vraiment pas le temps de chercher maintenant:. Je ne me sentirais pas à l'aise de faire juste une recherche superficielle et potentiellement mettre des informations erronées dans ma thèse

Je vous demande donc, ô communauté de programmation tout-puissant, peut vous aider? Bien sûr, je ne vous demande pas à la recherche vous-mêmes. Simplement, si vous savez pour que qui a des supports de cadre particulier / ne supporte pas, laissez-le comme une réponse. Si vous n'êtes pas sûr s'il vous plaît ne pas oublier de le signaler.

Merci beaucoup!


EDIT: @ewernli

  • Je demande au sujet (2).
  • Dans C # vous pouvez en effet émettez le code à l'exécution et dynamiquement créer de nouvelles classes, mais ils sont nouveaux cours, ils ne remplacent pas une classe existante. Ce que je voudrais faire est de transformer la classe en charge en temps, comme vous pouvez le faire en Java avec le ClassFileTransformer.
  • A propos de la modification de la signature d'une méthode: oui, vous avez raison. Je l'ai mentionné dans mon cas, je ne veux pas modifier l'interface de classe, mais le contenu de ses méthodes.

Votre réponse a été vraiment utile. Merci:)

Était-ce utile?

La solution

Demandez-vous au sujet (1) vrai remplacement de la classe lors de l'exécution, ou (2) des installations pour transformer la classe quand il est chargé ou (3) langues support de chargement de classe dynamique?

Prise en charge Java chargement de classe dynamique avec ClassLoader, transformation avec ClassFileTransformer, mais pas vrai remplacement de classe.

Je ne suis pas sûr pour C #, mais je pense que vous pouvez émettre un code à l'exécution et de créer une nouvelle classe dynamique, de sorte que vous pouvez réaliser (3) et probablement (2).

remplacement de la classe est vrai la plupart du temps pris en charge uniquement par langage dynamique , par exemple Smalltalk, Ruby, je suppose que Python et quelques autres. Cela nécessite la transformation des instances de la classe pour correspondre à la nouvelle forme. Ils initialize généralement les nouveaux champs à zéro si les changements de classe.

AFAIK, langages dynamiques à la machine virtuelle Java portage faire hacking étendue de ClassLoader au soutien de remplacement de la classe lors de l'exécution. Pour JRuby, consultez Un premier goût de dynamique Invoke pour obtenir plus de pointeurs comment ils le font maintenant, ce qui est problématique et comment le invokedynamic à venir pourrait aider.

Ce n'est pas offert dans les langues statiquement typés en raison de la complication du système de type . Si un changement de signature de la méthode dans une classe, d'autres classes existantes déjà chargées pourraient ne pas se conformer à la nécessaire nouvelle signature de la méthode qui est pas sûr. En Java, vous pouvez cependant changer une méthode aussi longtemps que la signature est le même en utilisant le Java Platform Debugger architecture .

Il y a eu une tentative d'ajouter cette fonctionnalité à Java et / ou langages à typage statique:

  • Prise en charge d'exécution pour les classes Java dynamiques de type sécurisé
  • Soutenir l'adaptation dynamique du non anticipée Comportement d'application
  • Une technique mise à jour dynamique de Java Software

Ce document fournit un aperçu général des problèmes connexes

  • In fl uence des systèmes de type sur l'évolution du logiciel dynamique

Je ne sais pas exactement si cette adresse vous question initiale, mais ces pointeurs pourrait être intéressant pour votre thèse de toute façon.

Autres conseils

Java langue ne prend pas en charge le remplacement de fichier de classe. La machine virtuelle Java expose la fonction via les classes que vous mentionnez. Par conséquent, tous qui ont été portées à la machine virtuelle Java peut en profiter.

Erlang supports swapping de code à chaud, et si vous cherchez aussi des cadres théoriques que des mises à jour de classe dynamique modèle, vous peut jeter un oeil à la Creol langue (interprétation).

La bibliothèque d'exécution de Objective-C prend en charge la construction dynamique et l'enregistrement des cours, l'enregistrement de la méthode paresseuse et « méthode swizzling » par lequel les implémentations de méthode peuvent être activés lors de l'exécution. Les versions précédentes prises en charge « Classe swizzling » par lequel une classe pourrait être remplacée par une autre lors de l'exécution, mais maintenant la méthode swizzling est utilisée à la place. Voici la doc de référence.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top