Outre une compréhension des accès entre les modules et leurs packages respectifs. Je crois que l'essentiel réside dans le système de module # Encapsulation forte-détendue et je choisirais simplement les parties pertinentes pour essayer de répondre à la question.
Qu'est-ce qui définit un accès réflexif illégal et quelles circonstances déclenchent l'avertissement?
Pour faciliter la migration vers Java-9, l'encapsulation forte des modules pourrait être assouplie.
Une implémentation peut fournir un accès statique , c'est-à-dire par bytecode compilé.
Peut fournir un moyen d'invoquer son système d'exécution avec un ou plusieurs packages d'un ou plusieurs de ses modules ouverts au code dans tous les modules sans nom , c'est-à-dire au code sur le chemin de classe. Si le système d'exécution est appelé de cette manière, et si, ce faisant, certaines invocations des API de réflexion réussissent, sinon elles auraient échoué.
Dans de tels cas, vous avez fini par créer un accès réfléchi qui est "illégal" puisque dans un monde purement modulaire, vous n'étiez pas censé faire de tels accès.
Comment tout cela s'enchaîne et qu'est-ce qui déclenche l'avertissement dans quel scénario?
Cette relaxation de l'encapsulation est contrôlée à l'exécution par une nouvelle option de lanceur --illegal-access
qui par défaut en Java9 est égale permit
. Le permit
mode assure
La première opération d'accès réfléchissant à un tel paquet provoque l'émission d'un avertissement, mais aucun avertissement n'est émis après ce point. Cet avertissement unique décrit comment activer d'autres avertissements. Cet avertissement ne peut pas être supprimé.
Les modes sont configurables avec des valeurs debug
(message ainsi que stacktrace pour chacun de ces accès), warn
(message pour chacun de ces accès) et deny
(désactive ces opérations).
Peu de choses à déboguer et à corriger sur les applications seraient: -
- Exécutez-le avec
--illegal-access=deny
pour connaître et éviter d' ouvrir des packages d'un module à un autre sans déclaration de module incluant une telle directive ( opens
) ou utilisation explicite de --add-opens
VM arg.
- Les références statiques du code compilé aux API internes JDK peuvent être identifiées à l'aide de l'
jdeps
outil avec l' --jdk-internals
option
Le message d'avertissement émis lorsqu'une opération d'accès réfléchissant illégale est détectée a la forme suivante:
WARNING: Illegal reflective access by $PERPETRATOR to $VICTIM
où:
$PERPETRATOR
est le nom complet du type contenant le code qui a invoqué l'opération réfléchissante en question plus la source du code (c'est-à-dire le chemin du fichier JAR), si disponible, et
$VICTIM
est une chaîne qui décrit le membre auquel accède, y compris le nom complet du type englobant
Questions pour un tel exemple d'avertissement: = JDK9: une opération d'accès réfléchissant illégale s'est produite. org.python.core.PySystemState
Enfin et une note importante, tout en essayant de vous assurer que vous ne faites pas face à de tels avertissements et que vous êtes en sécurité pour l'avenir, tout ce que vous avez à faire est de vous assurer que vos modules n'effectuent pas ces accès réfléchissants illégaux. :)