38
38
import com .oracle .svm .core .jdk .JDKInitializedAtRunTime ;
39
39
import com .oracle .svm .core .util .BasedOnJDKFile ;
40
40
import com .oracle .svm .core .util .VMError ;
41
+ import com .oracle .svm .util .ReflectionUtil ;
41
42
42
43
/**
43
44
* This file contains substitutions that are required for initializing {@link FileSystemProvider} at
@@ -79,11 +80,19 @@ final class Target_java_io_DefaultFileSystem_RunTime {
79
80
@ BasedOnJDKFile ("https://github.com/openjdk/jdk/blob/jdk-25+25/src/java.base/unix/classes/java/io/DefaultFileSystem.java#L39-L41" )
80
81
@ BasedOnJDKFile ("https://github.com/openjdk/jdk/blob/jdk-25+25/src/java.base/windows/classes/java/io/DefaultFileSystem.java#L39-L41" )
81
82
class DefaultFileSystemHolder {
82
- static final Target_java_io_FileSystem_RunTime FS ;
83
+ static final Object FS ;
83
84
static {
84
85
if (SubstrateUtil .HOSTED ) {
85
- // unused - layered images might want to initialize during image build
86
- FS = null ;
86
+ /*
87
+ * Should be unused, but layered images might want to initialize it during image build.
88
+ * We set it to the real default file system instead of null to guard against
89
+ * unintentional usages. In run-time init mode, we don't allow FileSystems in the image
90
+ * heap, so we would fail the image build with an exception if it happens, which helps
91
+ * to detect problems.
92
+ */
93
+ var defaultFileSystem = ReflectionUtil .lookupClass ("java.io.DefaultFileSystem" );
94
+ var getFileSystem = ReflectionUtil .lookupMethod (defaultFileSystem , "getFileSystem" );
95
+ FS = ReflectionUtil .invokeMethod (getFileSystem , null );
87
96
} else {
88
97
FS = Target_java_io_DefaultFileSystem_RunTime .getFileSystem ();
89
98
}
@@ -94,7 +103,7 @@ class DefaultFileSystemAccessor {
94
103
@ SuppressWarnings ("unused" )
95
104
static Target_java_io_FileSystem_RunTime get () {
96
105
VMError .guarantee (DefaultFileSystemHolder .FS != null , "DefaultFileSystemHolder.FS is null" );
97
- return DefaultFileSystemHolder .FS ;
106
+ return SubstrateUtil . cast ( DefaultFileSystemHolder .FS , Target_java_io_FileSystem_RunTime . class ) ;
98
107
}
99
108
}
100
109
0 commit comments