Con il rilascio di Java 7 è stato fornito il MethodHandle
, che consente a un utente di richiamare un metodo come se utilizzasse il suo bytecode sottostante. In particolare, la classe MethodHandles.Lookup
fornisce metodi factory per creare il metodo maniglie per accedere ai membri della classe:Perché utilizzare reflection per accedere ai membri della classe quando MethodHandle è più veloce?
I metodi di fabbrica su un oggetto di ricerca corrispondono a tutti i principali casi di utilizzo per metodi, costruttori, e campi. Ogni handle di metodo creato da un metodo factory è l'equivalente funzionale di un particolare comportamento bytecode.
Funzionalmente, questo è più o meno equivalente all'utilizzo della riflessione per accedere a questi stessi membri della classe, tuttavia method handles are faster than reflection.
Quindi, c'è qualche motivo per utilizzare ancora le funzionalità di riflessione come Field#get(..)
/Method.invoke(..)
o questi metodi sono effettivamente obsoleti con l'introduzione degli handle di metodo più veloci?
Nota che, mentre le maniglie di metodo sono stati introdotti in Java 7, la mia domanda si riferisce principalmente a Java 8, in cui sono stati ottimizzati per presunto raggiungere prestazioni pari a circa chiamate di campo/metodo diretto, superando la capacità di riflessione.
Per ulteriori dettagli sui manici del metodo, vedere [MethodHandle - Di cosa si tratta?] (Http: // stackoverflow.it/q/8823793/1247781) – Vulcan
Non sembra molto più veloce, soprattutto se si disattiva il controllo dell'accesso in reflection ('setAccessible (true)') – ZhongYu
@ bayou.io Sembra ragionevole, ma avete qualche test di benchmark come prova? La semplice modifica del benchmark nella domanda collegata per chiamare 'setAccessible (true)' e l'output di quei risultati sarebbe una prova sufficiente per me. – Vulcan