Domanda

Sto scrivendo la mia tesi di laurea, che si occupa di AOP in .NET, tra le altre cose, e ho citare la mancanza di supporto per la sostituzione di classi in fase di carico, come un fattore importante per il fatto che attualmente non esistono .NET framework AOP che eseguono vero tessitura dinamico -. non senza imporre il requisito che classi tessuti devono estendersi ContextBoundObject o MarshalByRefObject o esporre tutti loro semantica su un'interfaccia

È possibile tuttavia fare questo con Java nella JVM grazie a ClassFileTransformer:

  • estendere ClassFileTransformer.
  • Per sottoscrivere l'evento carico di classe.
  • Nella classe di carico, è riscrivere la classe e sostituirla.

Tutto ciò è molto bene, ma il mio direttore del progetto mi ha chiesto, del tutto negli ultimi minuti, per dargli un elenco di quadri (e linguaggi associati) che fanno / non supportano la sostituzione di classe. Io davvero non ho tempo di cercare questo momento. Non vorrei stare tranquillo solo facendo una ricerca superficiale e mettendo potenzialmente informazioni errate nella mia tesi

Quindi vi chiedo, oh onnipotente comunità dei programmatori, si può dare una mano? Naturalmente, io non ti sto chiedendo di ricerca di questo voi stessi. Semplicemente, se si sa sicuramente che una particolare supporti quadro / non supporta questo, lasciarlo come una risposta. Se non siete sicuri si prega di non dimenticare di farlo notare.

Grazie mille!


EDIT: @ewernli

  • sto chiedendo circa (2).
  • In C # è possibile infatti emettono il codice in fase di esecuzione e di creare nuove classi in modo dinamico, ma sono nuovi classi, essi non sostituiscono una classe esistente. Quello che mi piacerebbe fare è quello di trasformare la classe con carico-tempo, come si può fare in Java con l'ClassFileTransformer.
  • A proposito di modificare la firma di un metodo: sì, hai ragione. Avrei detto che nel mio caso io non voglio modificare l'interfaccia di classe, ma piuttosto il contenuto dei suoi metodi.

La tua risposta è stato davvero utile. Grazie:)

È stato utile?

Soluzione

Stai chiedendo di (1) vera sostituzione di classe in fase di esecuzione, oppure (2) impianti per trasformare la classe quando è caricato o (3) lingue classe di supporto dinamico di carico?

carico classe Java supporto dinamico con ClassLoader, trasformazione con ClassFileTransformer, ma nessun vero la sostituzione di classe.

Non sono sicuro per C #, ma penso che si può emettere il codice in fase di esecuzione e di creare nuova classe in modo dinamico, in modo da poter raggiungere (3) e, probabilmente, (2).

sostituzione vera classe è per lo più supportato solo da linguaggio dinamico , per esempio Smalltalk, Ruby, Python e credo che pochi altri. Ciò richiede la trasformazione delle istanze della classe in base alla nuova forma. Di solito inizializzare i nuovi campi a zero se i cambiamenti di classe.

Per quanto ne so, linguaggi dinamici portato alla JVM fare vasta hacking del ClassLoader al supporto di sostituzione di classe a run-time. Per JRuby, vedi Un primo assaggio di Invoke dinamica per ottenere più puntatori come lo fanno ora, ciò che è problematico e come l'imminente invokedynamic potrebbe aiutare.

Questo non è disponibile in lingue staticamente tipizzati a causa della complicazione con il tipo di sistema . Se un cambiamento firma del metodo in una classe, le altre classi esistenti già caricati potrebbero rispettare non necessario con la nuova firma del metodo che non è sicuro. In Java si può comunque cambiare un metodo fino a quando la firma è la stessa con il Java Platform Debugger Architecture .

Ci sono stati un tentativo di aggiungere questa funzionalità a Java, e / o staticamente tipizzato lingue:

  • supporto runtime per le classi Java type-safe dinamici
  • Sostenere imprevisti dinamica Adattamento del comportamento delle applicazioni
  • Una tecnica per l'aggiornamento dinamico del software Java

Questo documento fornisce una panoramica generale dei problemi connessi

  • influenza dei sistemi di tipo sull'evoluzione software dinamico

Non sono sicuro esattamente se tale indirizzo si domanda iniziale, ma questi puntatori potrebbe essere interessante per la tua tesi comunque.

Altri suggerimenti

Il Java lingua non supporta la sostituzione file di classe. La JVM espone la funzione tramite le classi di cui parli. Perciò tutti lingue che sono stati portati su JVM possono trarre vantaggio da esso.

Erlang supporti caldo codice Swapping, e se siete alla ricerca anche per quadri teorici che gli aggiornamenti di classe modello dinamico, è può dare un'occhiata alla Creol lingua (interpretato).

libreria di runtime di Objective-C supporta costruzione dinamica e la registrazione di classi, pigro registrazione metodo e "Metodo swizzling" con quale metodo le implementazioni possono essere commutati in fase di esecuzione. Le versioni precedenti supportate "Class swizzling" con cui una classe potrebbe essere sostituito per un altro in fase di esecuzione, ma ora il metodo swizzling viene utilizzato al posto. Ecco il documento di riferimento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top