Frage

ich meine Diplomarbeit zu schreiben, die sie mit AOP in .NET, unter anderem, und ich erwähne die fehlende Unterstützung für Klassen zur Ladezeit als wichtigen Faktor in der Tatsache zu ersetzen, dass es derzeit keine ist .NET AOP-Frameworks, die echte dynamische Weben auszuführen -. nicht ohne die Verpflichtung auferlegt wird, dass gewebte Klassen ContextBoundObject oder MarshalByRefObject erweitern müssen oder alle ihre Semantik auf einer Schnittstelle aussetzen

Sie können dies jedoch in dem JVM dank ClassFileTransformer mit Java tun:

  • Sie erweitern ClassFileTransformer.
  • abonnieren Sie zur Klasse Load-Ereignis.
  • Eine Klasse Last, die Klasse neu zu schreiben und sie ersetzen.

Das ist alles sehr gut, aber mein Projektdirektor hat mich gebeten, ganz in der letzten Minute, ihm eine Liste von Rahmen zu geben (und die damit verbundenen Sprachen), die tun / nicht-Klasse Ersatz unterstützen. Ich wirklich keine Zeit dafür jetzt zu suchen. Ich nicht wohl fühlen würde nur eine oberflächliche Forschung zu tun und möglicherweise fehlerhafte Informationen in meiner Arbeit setzen

Also frage ich dich, oh allmächtige Programmierung Community können Sie helfen? Natürlich, ich bitte Sie nicht diese selbst zu erforschen. Einfach gesagt, wenn Sie wissen, sicher , dass ein bestimmtes Framework unterstützt / nicht unterstützt dies nicht, es als eine Antwort hinterlassen. Wenn Sie sich nicht sicher, vergessen Sie bitte nicht, darauf hinzuweisen.

Vielen Dank!


EDIT: @ewernli

  • Ich bitte um (2).
  • In C # Sie tatsächlich Code zur Laufzeit emittieren können und neue Klassen dynamisch erstellen, aber sie sind neue Klassen, sie nicht über eine vorhandene Klasse ersetzen. Was ich möchte, ist zu tun, um die Klasse während der Ladezeit zu verwandeln, wie Sie in Java mit dem ClassFileTransformer tun können.
  • Über eine Methode Unterschrift ändern: ja, du hast Recht. Ich hätte in meinem Fall erwähnt, dass ich will nicht die Klasse Schnittstelle ändern, sondern der Inhalt seiner Methoden.

Ihre Antwort war sehr hilfreich. Danke:)

War es hilfreich?

Lösung

Sind Sie fragen über (1) wahre Klasse Ersatz zur Laufzeit, oder (2) Einrichtungen, die Klasse zu verwandeln, wenn es geladen wird oder (3) Sprachen, die Unterstützung dynamische Laden von Klassen?

Java-Unterstützung dynamische Laden von Klassen mit ClassLoader, Transformation mit ClassFileTransformer, aber keine wahre Klasse Ersatz.

Ich bin nicht sicher für C #, aber ich denke, Sie Code zur Laufzeit emittieren können und neue Klasse dynamisch erstellen, so dass Sie erreichen können (3) und wahrscheinlich (2).

True Klasse Ersatz wird meist nur unterstützt von dynamischer Sprache , z.B. Smalltalk, Ruby, ich denke, Python und ein paar andere. Dies erfordert die Transformation der Instanzen der Klasse die neue Form zu entsprechen. Sie initialisieren in der Regel die neuen Felder auf Null, wenn die Klassenänderungen.

AFAIK, dynamische Sprachen auf die JVM portierten macht umfangreiches Hacking von Classloader zu Support-Klasse Ersatz zur Laufzeit. Für JRuby finden Sie unter Ein erster Geschmack von invoke dynamischen mehr Zeiger zu bekommen, wie sie es tun jetzt, was ist problematisch und wie die kommende invokedynamic helfen könnte.

Dies ist nicht wegen der Komplikation in statisch typisierten Sprachen angeboten mit dem Typ-System . Wenn eine Methodensignatur Änderung in einer Klasse, andere bestehende Klassen bereits geladen notwendig ist möglicherweise nicht mit der neuen Methode Unterschrift erfüllen, die nicht sicher ist. In Java können Sie jedoch eine Methode ändern, solange die Signatur die gleiche mit der Java Platform Debugger Architecture .

Es gibt einige versucht worden, um diese Funktion zu Java hinzuzufügen und / oder statisch typisierten Sprachen:

  • Runtime-Unterstützung für typsichere dynamische Java-Klassen
  • Unterstützung Unerwartete Dynamische Anpassung Anwendungsverhalten
  • Eine Technik zur dynamischen Aktualisierung von Java Software

bietet Dieses Papier einen allgemeinen Überblick über die damit verbundene Probleme

  • In fl uss der Typsysteme auf dynamische Software Entwicklung

Nicht sicher genau, ob diese Adresse Sie erste Frage, aber diese Hinweise könnten ohnehin für Ihre These interessant sein.

Andere Tipps

Die Java Sprache nicht unterstützt Klassendatei ersetzt werden. Die JVM macht die Funktion über die Klassen, die Sie erwähnen. Daher sind alle Sprachen, die auf die JVM portiert wurden sie nutzen können.

Erlang unterstützt Hot-Swapping-Code, und wenn Sie suchen auch nach theoretischen Rahmen dieses Modell dynamischen Klasse-Updates, Sie nehmen einen Blick auf die Creol Sprache (interpretiert).

Ziel-C-Laufzeitbibliothek unterstützt die dynamische Konstruktion und Registrierung von Klassen, faul Methode Registrierung und „Methode Swizzling“, durch die Methodenimplementierungen können zur Laufzeit umgeschaltet werden. Frühere Versionen unterstützt „Klasse Swizzling“, durch die eine Klasse für eine andere zur Laufzeit ersetzt werden könnte, aber jetzt Verfahren Swizzling wird stattdessen verwendet. Hier ist der Verweis doc.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top