< prev index next >
src/java.base/share/classes/jdk/internal/loader/ClassLoaders.java
Print this page
@@ -34,10 +34,11 @@
import java.util.jar.Manifest;
import jdk.internal.access.JavaLangAccess;
import jdk.internal.access.SharedSecrets;
import jdk.internal.misc.VM;
+import jdk.internal.vm.annotation.Stable;
/**
* Creates and provides access to the built-in platform and application class
* loaders. It also creates the class loader that is used to locate resources
* in modules defined to the boot class loader.
@@ -52,20 +53,49 @@
// the built-in class loaders
private static final BootClassLoader BOOT_LOADER;
private static final PlatformClassLoader PLATFORM_LOADER;
private static final AppClassLoader APP_LOADER;
+ static class ArchivedData {
+ private final BootClassLoader boot_loader;
+ private final PlatformClassLoader platform_loader;
+ private final AppClassLoader app_loader;
+
+ private ArchivedData() {
+ boot_loader = BOOT_LOADER;
+ platform_loader = PLATFORM_LOADER;
+ app_loader = APP_LOADER;
+ }
+
+ static void archive() {
+ singleton = new ArchivedData();
+ }
+
+ static ArchivedData get() {
+ return singleton;
+ }
+
+ private static ArchivedData singleton;
+ }
+
// Creates the built-in class loaders.
static {
+ VM.initializeFromArchive(ArchivedData.class);
+ ArchivedData archivedData = ArchivedData.get();
+ if (archivedData != null) {
+ // assert VM.getSavedProperty("jdk.boot.class.path.append") == null
+ BOOT_LOADER = archivedData.boot_loader;
+ PLATFORM_LOADER = archivedData.platform_loader;
+ } else {
// -Xbootclasspath/a or -javaagent with Boot-Class-Path attribute
String append = VM.getSavedProperty("jdk.boot.class.path.append");
BOOT_LOADER =
new BootClassLoader((append != null && !append.isEmpty())
? new URLClassPath(append, true)
: null);
PLATFORM_LOADER = new PlatformClassLoader(BOOT_LOADER);
-
+ }
// A class path is required when no initial module is specified.
// In this case the class path defaults to "", meaning the current
// working directory. When an initial module is specified, on the
// contrary, we drop this historic interpretation of the empty
// string and instead treat it as unspecified.
@@ -73,11 +103,17 @@
if (cp == null || cp.isEmpty()) {
String initialModuleName = System.getProperty("jdk.module.main");
cp = (initialModuleName == null) ? "" : null;
}
URLClassPath ucp = new URLClassPath(cp, false);
+ if (archivedData != null) {
+ APP_LOADER = archivedData.app_loader;
+ APP_LOADER.setClassPath(ucp);
+ } else {
APP_LOADER = new AppClassLoader(PLATFORM_LOADER, ucp);
+ ArchivedData.archive();
+ }
}
/**
* Returns the class loader that is used to find resources in modules
* defined to the boot class loader.
@@ -142,11 +178,15 @@
static {
if (!ClassLoader.registerAsParallelCapable())
throw new InternalError();
}
- final URLClassPath ucp;
+ @Stable URLClassPath ucp;
+ void setClassPath(URLClassPath ucp) {
+ super.setClassPath(ucp);
+ this.ucp = ucp;
+ }
AppClassLoader(PlatformClassLoader parent, URLClassPath ucp) {
super("app", parent, ucp);
this.ucp = ucp;
}
@@ -188,10 +228,15 @@
* Called by the VM to support define package for AppCDS
*/
protected Package defineOrCheckPackage(String pn, Manifest man, URL url) {
return super.defineOrCheckPackage(pn, man, url);
}
+
+ // Called from VM only, during -Xshare:dump
+ private void resetArchivedStates() {
+ ucp = null;
+ }
}
/**
* Attempts to convert the given string to a file URL.
*
< prev index next >