Skip to content

Commit 50b3be0

Browse files
authored
Merge pull request #192 from jnr/better_module_handling
Use tricks to improve module visibility issues
2 parents 73a004b + 7e6ac00 commit 50b3be0

File tree

1 file changed

+21
-0
lines changed

1 file changed

+21
-0
lines changed

src/main/java/jnr/posix/JavaLibCHelper.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,27 @@ private static class ReflectiveAccess {
7878
private static final Field FILE_DESCRIPTOR_HANDLE;
7979

8080
static {
81+
try {
82+
Method getModule = Class.class.getMethod("getModule");
83+
Class<?> Module = Class.forName("java.lang.Module");
84+
Method isOpen = Module.getMethod("isOpen", String.class, Module);
85+
Method isNamed = Module.getMethod("isNamed");
86+
Method addOpens = Module.getMethod("addOpens", String.class, Module);
87+
Object JNRPosixModule = getModule.invoke(ReflectiveAccess.class);
88+
Object JavaBaseModule = getModule.invoke(FileDescriptor.class);
89+
90+
if (!((Boolean) isOpen.invoke(JavaBaseModule, "java.io", JNRPosixModule))) {
91+
// warn that many APIs will be broken without module access
92+
System.err.println("Some JDK modules may not be open to jnr-posix, which will break file descriptor and process APIs. See https://github.com/jnr/jnr-posix/wiki/Using-POSIX-with-Java-Modules");
93+
} else if (!((Boolean) isNamed.invoke(JNRPosixModule))) {
94+
// explicitly open them to avoid the implicitly open warning
95+
addOpens.invoke(JavaBaseModule, "java.io", JNRPosixModule);
96+
addOpens.invoke(JavaBaseModule, "sun.nio.ch", JNRPosixModule);
97+
}
98+
} catch (Exception e) {
99+
// ignore, we're not on Java 9+
100+
}
101+
81102
Method getFD;
82103
Class selChImpl;
83104
try {

0 commit comments

Comments
 (0)