A parte una comprensione degli accessi tra i moduli e i rispettivi pacchetti. Credo che il punto cruciale risieda nel Module System # Relaxed-strong-encapsulation e vorrei solo selezionare le parti rilevanti per cercare di rispondere alla domanda.
Cosa definisce un accesso riflessivo illegale e quali circostanze attivano l'avviso?
Per aiutare nella migrazione a Java-9, il forte incapsulamento dei moduli potrebbe essere allentato.
Un'implementazione può fornire l' accesso statico , cioè tramite bytecode compilato.
Può fornire un mezzo per invocare il suo sistema run-time con uno o più pacchetti di uno o più dei suoi moduli aperti al codice in tutti i moduli senza nome , cioè al codice sul classpath. Se il sistema di runtime viene richiamato in questo modo, e se così facendo alcune invocazioni delle API di riflessione hanno esito positivo dove altrimenti avrebbero fallito.
In questi casi, hai effettivamente finito per creare un accesso riflessivo che è "illegale" poiché in un mondo modulare puro non dovevi fare tali accessi.
Come tutto si blocca e cosa fa scattare l'avvertimento in quale scenario?
Questo rilassamento dell'incapsulamento è controllato in fase di esecuzione da una nuova opzione di avvio --illegal-access
che per impostazione predefinita in Java9 è uguale permit
. La permit
modalità garantisce
La prima operazione di accesso riflessivo a qualsiasi pacchetto di questo tipo provoca l'emissione di un avviso, ma dopo quel punto non viene emesso alcun avviso. Questo singolo avviso descrive come abilitare ulteriori avvisi. Questo avviso non può essere soppresso.
Le modalità sono configurabili con valori debug
(messaggio così come stacktrace per ogni accesso di questo tipo), warn
(messaggio per ciascuno di questi accessi) e deny
(disabilita tali operazioni).
Poche cose per eseguire il debug e correggere sulle applicazioni sarebbero: -
- Eseguilo con
--illegal-access=deny
per conoscere ed evitare di aprire pacchetti da un modulo a un altro senza una dichiarazione del modulo che includa tale direttiva ( opens
) o l'uso esplicito di --add-opens
VM arg.
- I riferimenti statici dal codice compilato alle API interne a JDK potrebbero essere identificati utilizzando lo
jdeps
strumento con l' --jdk-internals
opzione
Il messaggio di avviso emesso quando viene rilevata un'operazione di accesso riflessivo illegale ha la seguente forma:
WARNING: Illegal reflective access by $PERPETRATOR to $VICTIM
dove:
$PERPETRATOR
è il nome completo del tipo contenente il codice che ha richiamato l'operazione riflessiva in questione più il codice sorgente (cioè, il percorso del file JAR), se disponibile, e
$VICTIM
è una stringa che descrive il membro a cui si accede, incluso il nome completo del tipo di inclusione
Domande per tale avviso di esempio: = JDK9: si è verificata un'operazione di accesso riflessivo illegale. org.python.core.PySystemState
Ultima e importante nota, mentre cerchi di assicurarti di non affrontare tali avvertimenti e di essere al sicuro in futuro, tutto ciò che devi fare è assicurarti che i tuoi moduli non stiano facendo quegli accessi riflessivi illegali. :)