2015-06-23 12 views
5

ad es. conPerché non è possibile fare riferimento a metadati o metodi in Java?

class Foo { 
    Integer bar; 
} 

mi chiedo perché non v'è una caratteristica lingua che mi permette di fare

Foo.class.bar //yes, xxx.class returns something of java.lang.Class<T> 

per riferirsi al bar campo meta?

Sto leggendo il libro Pro JPA 2 e mi sembra che la generazione di metamodelli canonici sia necessaria, perché ciò non è possibile in Java.

Nota, questa è una domanda teoricaper curiosità, in cui vorrei ottenere alcune informazioni, perché questa funzione non è stata implementata.

--- --- Aggiornamento

Elaborare mia domanda un po 'di più, si consideri l'esempio di aggiunta di attributi in JPA dalle API Entity Grafico:

EntityGraph<Foo> g = myEntityManager.createEntityGraph(Foo.class) 
g.addAttributeNodes("bar") 

Non c'è formale link (per il compilatore/gli IDE) tra la stringa "bar" e l'attributo Foo's bar.

+0

È possibile utilizzare 'Field field = Foo.classgetDeclaredField (" bar ");' –

+0

Lo so, ma poi utilizzo una stringa letterale, che non è di tipo né refactoring sicuro –

+0

Poiché java 8, esiste una rappresentazione del metodo : 'System.out :: println' sebbene non abbia capacità di riflessione come' Field'. –

risposta

0

In teoria, non chiamerei proprietà/campo di classe un campo "meta". I meta-dati sono assegnati a proprietà/campi tramite annotazioni java e questo metadati è accessibile tramite riflessione. Facendo Foo.class.bar si distrugge l'intero punto dell'orientamento all'oggetto di questo bellissimo linguaggio statico. (O in altre parole java non è abbastanza bravo da farlo))

+0

non sono specifici dell'annotazione. Scrivendo Foo.class.bar il compilatore può livellare ulteriormente il sistema di tipi e verificare che la barra esista in contrasto con la Foo corrente.classgetDeclaredField ("bar"), dove "bar" è solo una stringa letterale. –

0

Direi che il motivo principale per l'assenza di una tale caratteristica è che non sarebbe utile.

Perché dovremmo mai chiedere la meta-informazione di un campo specifico in una classe specifica?

Se eseguiamo l'hardcode della coppia di classi e campi, conosciamo già tutte le meta-informazioni del campo, perché non possono essere modificate in fase di runtime. Quale sarebbe lo scopo delle informazioni ottenute tramite Foo.class.bar.getType() quando sappiamo già che il risultato è Integer.class?

+0

non si tratta di chiedere le meta-informazioni di un campo: si tratta di fare riferimento a quel campo su una classe, non a livello di istanza. –

1

Perché .class non è un campo magica che restituisce la classe corrente al momento della compilazione, è solo un sugar per sostituire getClass() metodo, che verrà eseguito solo in fase di esecuzione nell'istanza di Class oggetto. L'implementazione della tua "funzionalità" richiede la ricostruzione di un intero concetto.

La teoria più credibile che risponda alla tua domanda si baserà sull'idea, che il tuo 'elemento' non sembra davvero 'utile' al momento, quando il modello di riflessione è stato progettato in Java.