2013-08-09 13 views
6

Per quanto ne so e capisco,linguaggi statici e di riflessione

Riflessione è la capacità di creare/modificare il codice sorgente in fase di esecuzione.

Da Wikipedia:

  • Discover e modificare costruzioni codice sorgente (come blocchi di codice, classi, metodi, protocolli, ecc) come oggetto prima classe al runtime.
  • Converti una stringa che corrisponde al nome simbolico di una classe o funzione in un riferimento a o una chiamata di tale classe o funzione.
  • Valuta una stringa come se fosse un'istruzione di codice sorgente in fase di esecuzione.
    Creare un nuovo interprete per il codice byte della lingua per dare un nuovo
    significato o scopo per un costrutto di programmazione.

I linguaggi dinamici sono linguaggi che possiamo eval (valutare diretto dalla stringa) a run-time.

Da wikipedia: "estensione del programma, con l'aggiunta di nuovo codice, estendendo gli oggetti e le definizioni, o modificando il sistema di tipo"

Ok, ora, la mia domanda è: Come statica lingua ד (senza capacità di valutazione) può avere una riflessione (ad es. Java)? (il nuovo codice sorgente non valuta?: /)

Grazie in anticipo!

+0

Java ha una libreria di manipolazione del codice byte chiamata [ASM] (http://asm.ow2.org/).Reflection non viene utilizzato per aggiungere nuovo codice come descritto nella domanda. –

+1

Reflection consente di alterare (sì, può essere dannoso in alcuni casi) con una classe interrogando sui suoi metodi, campi, livelli di accesso e simili ma non si genera nuovo codice_. Ha altri usi come, ad esempio, il richiamo di un metodo definito in alcune classi basato solo sui dati su di esso (* metadata *). Ottieni un'istanza da una classe, ne ottieni un metodo basato sulla sua azienda e quindi la invochi. – Gamb

+0

@Gamb 10x, ma se si modifica un codice sorgente, quindi si genera un codice sorgente (come dice wikipedia), vero? – gran33

risposta

4

Penso che la spiegazione di wikipedia non sia davvero ben formulata.

riflessione (o introspezione) non si tratta di creazione di codice durante l'esecuzione ma piuttosto sulla capacità di codice per riflettere su se stessa in runtime (e modificare il suo comportamento in base a questo). Gli esempi potrebbero ottenere informazioni sul tipo dell'oggetto (come RTTI in C++) o ottenere i metadati associati all'oggetto (come le annotazioni in Java).

La generazione del codice di runtime è più correlata a di prima classe piuttosto che alla riflessione, quindi direi che l'attuale articolo di wikipedia è un po 'fuorviante.

UPDATE

In altre parole risposta a questo:

Ok, ora, la mia domanda è, come può il linguaggio statico (senza possibilità eval) può avere riflessione (per esempio Java)?

... sarebbe che la riflessione non si basa su capacità evel. Queste sono 2 caratteristiche linguistiche separate.

E inoltre, come ha sottolineato Giulio Franco nei commenti - Java è in grado di generare codice di runtime \ manipolazione (vedere CGLIB per esempio).

+1

Vorrei aggiungere che le classi Java sono caricate in fase di esecuzione, e c'è una classe Java che consente di compilare e caricare una classe Java al volo. Quindi, in realtà, Java ** può ** aggiungere codice in fase di runtime. Forse puoi anche rimuovere, modificare e ricaricare una classe, ma penso che questo abbia delle limitazioni (forse non puoi scaricare una classe attualmente usata). –

Problemi correlati