ce qui est illégal réfléchissant accès
Il y a beaucoup de questions autour des propos illégaux réfléchissant accès à Java 9.
Maintenant, ce que je ne trouve pas parce que Google vomit est des gens qui essaient de contourner les messages d'erreur, est-ce illégal réfléchissant accès est réellement.
Donc ma question est assez simple:
Ce qui définit un illégales réfléchissant accès ainsi que les circonstances de déclenchement de l'avertissement?
J'ai compris que cela a quelque chose à voir avec l'encapsulation de principes qui ont été introduites dans Java 9, mais comment tout cela se tient et ce qui déclenche l'avertissement dans ce scénario, je ne peux pas trouver une explication à.
ceci peut vous intéresser: jaxenter.com/jdk-9-replace-permit-illegal-access-134180.html
OriginalL'auteur Tschallacka | 2018-05-09
Vous devez vous connecter pour publier un commentaire.
En dehors de la compréhension de l'accès entre les modules et les paquets. Je crois que le cœur du problème réside dans le Système de Module#Détendu-fort-encapsulation et je voudrais juste écrémer les parties pertinentes de la peine d'essayer et de répondre à la question.
De l'aide dans la migration vers Java9, la forte encapsulation des modules pourraient être assouplies.
Une mise en œuvre peut fournir statique accès, c'est à dire par le code compilé.
Peut fournir un moyen d'invoquer son système d'exécution avec un ou plusieurs paquets d'un ou de plusieurs de ses modules d'ouvrir le code de la tous les modules sans nom, c'est à dire à code sur le chemin de la classe. Si le système d'exécution est appelé de cette façon, et si, ce faisant, certaines invocations de la réflexion Api de réussir là où ils ont échoué.
Dans de tels cas, vous avez fini par faire une réfléchissant accès qui est "illégal" depuis dans un pur monde modulaire vous n'étiez pas censé faire ces accès.
Cette relaxation de l'encapsulation est contrôlée à l'exécution, par un nouveau lanceur option
--illegal-access
qui, par défaut, dans Java9 est égal àpermit
. Lepermit
mode veilleLes modes sont configurables avec les valeurs
debug
(message ainsi que stacktrace pour chaque accès),warn
(message pour chacun de ces accès) etdeny
(désactive ces opérations).Peu de choses pour le débogage et le fixer sur les demandes seront:-
--illegal-access=deny
pour apprendre à connaître et à éviter ouvriring paquets à partir d'un module à l'autre sans un module de déclaration, y compris une directive(opens
) ou une utilisation explicite de--add-opens
VM arg.Références statiques de code compilé pour JDK-interne de l'Api peut être identifié à l'aide de la
jdeps
outil avec la--jdk-internals
optionQuestions pour un échantillon d'avertissement: = JDK9: Un illégales réfléchissant accès opération a eu lieu. org.python.de base.PySystemState
Dernier et il est important de noter, tout en essayant de s'assurer que vous n'avez pas face à de telles mises en garde et sont avenir sûr, tout ce que vous devez faire est de vous assurer que vos modules ne sont pas ceux illégale réfléchissant accès. 🙂
OriginalL'auteur nullpointer
Il y a un Oracle l'article j'ai trouvé en ce qui concerne Java 9 module de système
Comme l'a souligné dans https://stackoverflow.com/a/50251958/134894, les différences entre les
AccessibleObject#setAccessible
pour JDK8 et JDK9 sont instructifs. Plus précisément, JDK9 ajoutéqui met en évidence l'importance de modules et de leurs exportations (en Java 9)
Je n'ai pas l'expérience directement avec cela, mais ce serait ma compréhension, et lu en complément de l'article mentionné ailleurs (jaxenter.com/jdk-9-replace-permit-illegal-access-134180.html) qui semble être le cas. Lancez votre JVM avec
–illegal-access=permit
...Bien que cela va rendre les choses plus intéressantes à essayer d'obtenir des choses à travailler pour des choses quand ils décident d'aller dans le module. Super moments de plaisir à l'avance.
Pour différentes valeurs de
fun
J'ai accepté l'autre réponse, car elle a fourni un complément d'explication, et elle a plus d'une réponse à la question, mais malheureusement je ne peux pas accepter deux réponses.
OriginalL'auteur ptomli
Il suffit de regarder
setAccessible()
méthode utilisée pour accéder àprivate
champs et méthodes:https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/AccessibleObject.html#setAccessible-boolean-
https://docs.oracle.com/javase/9/docs/api/java/lang/reflect/AccessibleObject.html#setAccessible-boolean-
Maintenant, il ya beaucoup plus les conditions requises pour que cette méthode fonctionne. La seule raison pour laquelle elle ne casse pas presque tous de l'ancien logiciel est que les modules générés automatiquement à partir de la plaine des Jarres sont très permissive (ouvert et l'exportation de tout pour tout le monde).
OriginalL'auteur user158037