6161import java .util .HashSet ;
6262import java .util .LinkedHashSet ;
6363import java .util .List ;
64- import java .util .NoSuchElementException ;
6564import java .util .Objects ;
6665import java .util .Optional ;
6766import java .util .Set ;
@@ -138,6 +137,10 @@ public final class NativeImageClassLoaderSupport {
138137
139138 private final Set <Class <?>> classesToIncludeUnconditionally = Collections .newSetFromMap (new ConcurrentHashMap <>());
140139
140+ private final Method implAddReadsAllUnnamed = ReflectionUtil .lookupMethod (Module .class , "implAddReadsAllUnnamed" );
141+ private final Method implAddEnableNativeAccess = ReflectionUtil .lookupMethod (Module .class , "implAddEnableNativeAccess" );
142+ private final Method implAddEnableNativeAccessToAllUnnamed = ReflectionUtil .lookupMethod (Module .class , "implAddEnableNativeAccessToAllUnnamed" );
143+
141144 @ SuppressWarnings ("this-escape" )
142145 protected NativeImageClassLoaderSupport (ClassLoader defaultSystemClassLoader , String [] classpath , String [] modulePath ) {
143146
@@ -402,39 +405,6 @@ void serviceProvidersForEach(BiConsumer<String, Collection<String>> action) {
402405 serviceProviders .forEach ((key , val ) -> action .accept (key , Collections .unmodifiableCollection (val )));
403406 }
404407
405- private static void implAddReadsAllUnnamed (Module module ) {
406- try {
407- Method implAddReadsAllUnnamed = Module .class .getDeclaredMethod ("implAddReadsAllUnnamed" );
408- ModuleSupport .accessModuleByClass (ModuleSupport .Access .OPEN , NativeImageClassLoaderSupport .class , Module .class );
409- implAddReadsAllUnnamed .setAccessible (true );
410- implAddReadsAllUnnamed .invoke (module );
411- } catch (ReflectiveOperationException | NoSuchElementException e ) {
412- VMError .shouldNotReachHere ("Could not reflectively call Module.implAddReadsAllUnnamed" , e );
413- }
414- }
415-
416- static void implAddEnableNativeAccess (Module module ) {
417- try {
418- Method implAddEnableNativeAccess = Module .class .getDeclaredMethod ("implAddEnableNativeAccess" );
419- ModuleSupport .accessModuleByClass (ModuleSupport .Access .OPEN , NativeImageClassLoaderSupport .class , Module .class );
420- implAddEnableNativeAccess .setAccessible (true );
421- implAddEnableNativeAccess .invoke (module );
422- } catch (ReflectiveOperationException | NoSuchElementException e ) {
423- VMError .shouldNotReachHere ("Could not reflectively call Module.implAddEnableNativeAccess" , e );
424- }
425- }
426-
427- static void implAddEnableNativeAccessToAllUnnamed () {
428- try {
429- Method implAddEnableNativeAccess = Module .class .getDeclaredMethod ("implAddEnableNativeAccessToAllUnnamed" );
430- ModuleSupport .accessModuleByClass (ModuleSupport .Access .OPEN , NativeImageClassLoaderSupport .class , Module .class );
431- implAddEnableNativeAccess .setAccessible (true );
432- implAddEnableNativeAccess .invoke (null );
433- } catch (ReflectiveOperationException | NoSuchElementException e ) {
434- VMError .shouldNotReachHere ("Could not reflectively call Module.implAddEnableNativeAccessToAllUnnamed" , e );
435- }
436- }
437-
438408 protected List <Path > modulepath () {
439409 return Stream .concat (imagemp .stream (), buildmp .stream ()).toList ();
440410 }
@@ -481,7 +451,7 @@ void processClassLoaderOptions() {
481451 });
482452 processOption (NativeImageClassLoaderOptions .AddReads ).forEach (val -> {
483453 if (val .targetModules .isEmpty ()) {
484- implAddReadsAllUnnamed ( val .module );
454+ ReflectionUtil . invokeMethod ( implAddReadsAllUnnamed , val .module );
485455 } else {
486456 for (Module targetModule : val .targetModules ) {
487457 Modules .addReads (val .module , targetModule );
@@ -490,10 +460,10 @@ void processClassLoaderOptions() {
490460 });
491461 NativeImageClassLoaderOptions .EnableNativeAccess .getValue (parsedHostedOptions ).values ().stream ().flatMap (m -> Arrays .stream (SubstrateUtil .split (m , "," ))).forEach (moduleName -> {
492462 if ("ALL-UNNAMED" .equals (moduleName )) {
493- implAddEnableNativeAccessToAllUnnamed ( );
463+ ReflectionUtil . invokeMethod ( implAddEnableNativeAccessToAllUnnamed , null );
494464 } else {
495465 Module module = findModule (moduleName ).orElseThrow (() -> userWarningModuleNotFound (NativeImageClassLoaderOptions .EnableNativeAccess , moduleName ));
496- implAddEnableNativeAccess ( module );
466+ ReflectionUtil . invokeMethod ( implAddEnableNativeAccess , module );
497467 }
498468 });
499469 }
0 commit comments