Skip to content

Commit e598c0c

Browse files
committed
svm: use ReflectionUtil in NativeImageClassLoaderSupport
1 parent 68c0f82 commit e598c0c

File tree

1 file changed

+7
-37
lines changed

1 file changed

+7
-37
lines changed

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/NativeImageClassLoaderSupport.java

+7-37
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@
6161
import java.util.HashSet;
6262
import java.util.LinkedHashSet;
6363
import java.util.List;
64-
import java.util.NoSuchElementException;
6564
import java.util.Objects;
6665
import java.util.Optional;
6766
import 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 static final Method implAddReadsAllUnnamed = ReflectionUtil.lookupMethod(Module.class, "implAddReadsAllUnnamed");
141+
private static final Method implAddEnableNativeAccess = ReflectionUtil.lookupMethod(Module.class, "implAddEnableNativeAccess");
142+
private static 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

Comments
 (0)