2015-10-16 11 views
8

Quali sono i potenziali problemi che devo prestare attenzione quando si utilizza il riflesso. Sono molto confuso nella riflessione, perché java fornisce questo tipo di funzionalità per accedere ai dati privati ​​membri.Privato è privato, quindi Perché java consente di accedere al metodo privato utilizzando la riflessione?

privato: Come ci avrei pensato, solo la classe in cui si è dichiarata può vederlo.

Allora perché è possibile accedere a cose private in altre classi? questa terminologia (riflessione) stravolge completamente il mio concetto di proprietà private (Access Specifier) ​​in java.

Ho visitato molti collegamenti su questi argomenti ma non ho dato una spiegazione completa su questi argomenti. esempio:

package example; 

import java.lang.reflect.Method; 

class A{ 
    private void privateMethod(){ 
     System.out.println("hello privateMethod()"); 
    } 
} 
class B{ 
    public static void main(String[] args) throws Exception { 
     A d = new A(); 
     Method m = A.class.getDeclaredMethod("privateMethod");  
     m.setAccessible(true); 
     m.invoke(d); 
    } 
} 

Quindi, per favore spiegare scenario di questo approccio in modo approfondito? Ho bisogno di vantaggi e svantaggi per l'accessibilità dei metodi privati ​​in altre classi?

+11

http://stackoverflow.com/questions/1239581/why-is-it-allowed-to-access-java-private-fields-via-reflection –

+1

La maggior parte dei progetti regolari non dovrebbe richiedere alcuna riflessione, poiché se si hai semplicemente bisogno di ripensare alla tua architettura (ci sono ovviamente delle eccezioni). Un posto dove uso regolarmente la riflessione è in UnitTests. Puoi semplicemente provare più scenari modificando un campo privato usando la riflessione negli UnitTests. Ad esempio un booleano. Diciamo che hai un'impostazione booleana e vuoi testare entrambi gli scenari in un Test unitario. Il valore predefinito nel tuo progetto è falso, quindi per prima cosa testalo. E poi usi la riflessione per metterla (temporanea) su true e testare l'altro scenario. –

+0

qualcuno può spiegare con un esempio? perché sarà molto chiaro sul mio concetto. –

risposta

1

Tutte le "private" e le altre forme di dichiarazione sono flag per lo strumento di sviluppo in modo che sappia come si intende utilizzare il campo o il metodo in questione. Questo è così lo strumento di sviluppo può dare avvertimenti o errori allo sviluppatore quando usano queste classi/campi/metodi in un modo in cui non erano destinati.

Reflection è uno strumento che consente allo sviluppatore di ignorare o aggirare questi flag indicando che si sta utilizzando la classe/campo/metodo in un modo in cui non è mai stato previsto. Quindi in generale la riflessione mostra una cattiva architettura.

Quindi non ci sono "vantaggi o svantaggi" nel dichiarare qualcosa come privato o pubblico o statico; sono semplicemente strumenti per mantenere pulito e compartimentato il codice, consentendo solo agli sviluppatori di accedere/utilizzare le tue classi/campi/metodi in modi particolari.

+3

Questo non è corretto. La JVM imporrà l'accessibilità (disabilitando le soluzioni riflessive) quando è presente un gestore della sicurezza. Dire che questo è "solo" un suggerimento in fase di compilazione è sbagliato; è solo che il gestore della sicurezza non è abilitato di default (e la creazione di un'app in presenza di un SM è più difficile). Queste caratteristiche riflessive sono utilizzate da alcuni framework molto utili, come framework di tipo serializzazione, cache di oggetti distribuiti, framework di persistenza e framework di simulazione. –

1

Nella maggior parte dei casi, i modificatori di accesso servono a mantenere parti del codice che non si desidera che le persone leghino alla vista. La possibilità di accedere a metodi privati ​​utilizzando la riflessione può essere utile dal punto di vista degli strumenti. Java ha un meccanismo di sicurezza che consente a questa funzione di essere disabilitata. Questo site ha alcune informazioni sul modello di sicurezza java relativo alla riflessione (parte inferiore della pagina)

Questo vale solo in situazioni in cui il codice verrà eseguito con codice non attendibile. Se altri sviluppatori hanno accesso al tuo codice o hanno le tue librerie, non c'è nulla che tu possa fare per impedire loro di eseguire il codice senza un responsabile della sicurezza o modificando i modificatori. Questo è efficace solo in un ambiente controllato.