Maison > Java > javaDidacticiel > Comment puis-je résoudre l'exception InaccessibleObjectException de Java 9 : « Impossible de rendre {member} accessible » ?

Comment puis-je résoudre l'exception InaccessibleObjectException de Java 9 : « Impossible de rendre {member} accessible » ?

DDD
Libérer: 2024-12-26 05:03:13
original
645 Les gens l'ont consulté

How Can I Resolve Java 9's InaccessibleObjectException:

Tackling InaccessibleObjectException dans Java 9 : "Impossible de rendre {member} accessible : le module {A} n'ouvre pas {package}" à {B}"

Dans Java 9, l'introduction du système de modules de plate-forme a entraîné une encapsulation plus stricte. Ce monde encapsulé nous lance parfois la redoutable InaccessibleObjectException, en particulier dans le contexte de bibliothèques comme Spring, Hibernate et JAXB.

Le coupable derrière l'exception : L'exception implique qu'un membre spécifique ( méthode/champ/classe) dont l'accès est restreint en raison des limitations du système de module. Ces limitations nécessitent généralement que le membre soit public ou que son package soit exporté. La réflexion ajoute une autre couche de défi, car elle tente de contourner ces contrôles d'accès.

Résoudre l'exception : Pour éviter l'exception, le système de modules doit être convaincu d'autoriser l'accès à l'élément restreint. . Voici comment vous pouvez aborder cela dans différents scénarios :

Scénario 1 : Appel réfléchi dans le JDK

L'exception se produit lorsqu'une bibliothèque/un framework invoque un module JDK via la réflexion. Ici, les modules JDK ne peuvent pas être modifiés, donc les indicateurs de ligne de commande entrent en jeu.

  • Solution :

    • Utilisez l'indicateur '--add-opens' pour autoriser explicitement l'accès par réflexion au package spécifique dans le JDK module.
  • Exemple :

    • Pour répondre à "... Impossible de rendre ClassLoader.defineClass accessible..."
    • Exécutez la JVM avec : java --add-opens java.base/java.lang=ALL-UNNAMED

Scénario 2 : Réflexion sur le code d'application

Dans ce cas, la réflexion est utilisé dans un module pour accéder à un autre module. En tant que développeur, vous avez plus de contrôle sur le module auquel vous accédez ici.

  • Solution :

    • Modifier le descripteur de module du module accédé ( {A}) pour :

      • Exporter le package vers tous les modules : exports {package};
      • Exporter le package spécifiquement vers le module d'accès : exporte {package} vers {B};
      • Ouvre le package à tous les modules : ouvre {package};
      • Ouvrez le package spécifiquement pour le module d'accès : ouvre {package} sur {B} ;
      • Ouvrez le module entier : ouvrez le module {A} { ... };

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal