Utilisation d'IDEA-EAP pour des expériences de développement JDK9.
Je reçois l'erreur suivante -
Error:(3, 20) Java: package jdk.internal.misc is not visible (package jdk.internal.misc is declared in module Java.base, which does not export it to module com.jigsaw.npe)
La définition de classe est comme -
package experiment;
import jdk.internal.misc.Unsafe;
public class CompareAndSwap {
static Unsafe UNSAFE = Unsafe.getUnsafe();
...
}
J'ai essayé d'inclure un module-info.Java
également dans le module créé en utilisant le IDE avec les instructions suivantes -
module com.jigsaw.npe {
requires Java.base;
}
La structure du répertoire ressemble maintenant à celle illustrée -
Le IDE reflète cependant le module-info.Java
comme inutilisé et c'est probablement la raison pour laquelle je ne suis pas en mesure de définir le module com.jigsaw.npe
comme essayé ci-dessus.
Vous cherchez de l'aide sur la façon de placer correctement le module-info.Java et/ou autre chose que ce que j'ai manqué.
réponse de Nicolai est correct en ce qui concerne les techniques nécessaires pour exporter un paquet non exporté depuis le Java.base
module ou de tout autre module.
Mais si l'objectif est d'utiliser Unsafe
, la façon de le faire est d'utiliser Sun.misc.Unsafe
qui est exporté par le jdk.unsupported
module. Si vous compilez votre code pour le module sans nom, vous n'avez rien à faire de spécial concernant les modules pour y accéder. Si vous compilez du code dans un module, vous devez ajouter
requires jdk.unsupported;
à ton module-info.Java
fichier.
Pour utiliser Unsafe
, vous devez appliquer la technique réfléchissante setAccessible
pour accéder au champ, ce qui est le même que pour les versions précédentes du JDK:
import Sun.misc.Unsafe;
...
Field theUnsafeField = Unsafe.class.getDeclaredField("theUnsafe");
theUnsafeField.setAccessible(true);
Unsafe theUnsafe = (Unsafe)theUnsafeField.get(null);
Même si Unsafe
est dans le jdk.unsupported
module, cette technique est prise en charge dans JDK 9, conformément à JEP 26 .
Le module Java.base ne fait pas export le package jdk.internal.misc.
, donc le type jdk.internal.misc.Unsafe
n'est pas accessible - en conséquence, la compilation échoue.
Vous pouvez lui faire exporter le package en ajoutant l'option de ligne de commande suivante:
# if you want to access it from com.jigsaw.npe only:
--add-exports Java.base/jdk.internal.misc=com.jigsaw.npe
# if you want to access from all code:
--add-exports Java.base/jdk.internal.misc=ALL-UNNAMED
Vous devrez le faire lors de la compilation (javac
) et lors de l'exécution (Java
) du code.