< prev index next >
src/java.base/share/classes/java/lang/System.java
Print this page
@@ -41,10 +41,11 @@
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Module;
import java.net.URL;
import java.security.AccessControlContext;
+import java.security.ProtectionDomain;
import java.util.Properties;
import java.util.PropertyPermission;
import java.util.Map;
import java.security.AccessController;
import java.security.PrivilegedAction;
@@ -1843,10 +1844,43 @@
}
return new PrintStream(new BufferedOutputStream(fos, 128), true);
}
/**
+ * Logs an exception/error at initialization time to stdout or stderr.
+ *
+ * @param printToStderr to print to stderr rather than stdout
+ * @param printStackTrace to print the stack trace
+ * @param msg the message to print before the exception, can be {@code null}
+ * @param e the exception or error
+ */
+ private static void logInitException(boolean printToStderr,
+ boolean printStackTrace,
+ String msg,
+ Throwable e) {
+ if (VM.initLevel() < 1) {
+ throw new InternalError("system classes not initialized");
+ }
+ PrintStream log = (printToStderr) ? err : out;
+ if (msg != null) {
+ log.println(msg);
+ }
+ if (printStackTrace) {
+ e.printStackTrace(log);
+ } else {
+ log.println(e);
+ for (Throwable suppressed : e.getSuppressed()) {
+ log.println("Suppressed: " + suppressed);
+ }
+ Throwable cause = e.getCause();
+ if (cause != null) {
+ log.println("Caused by: " + cause);
+ }
+ }
+ }
+
+ /**
* Initialize the system class. Called after thread initialization.
*/
private static void initPhase1() {
// VM might invoke JNU_NewStringPlatform() to set those encoding
@@ -1920,17 +1954,29 @@
private static Layer bootLayer;
/*
* Invoked by VM. Phase 2 module system initialization.
* Only classes in java.base can be loaded in this phase.
+ *
+ * @param printToStderr print exceptions to stderr rather than stdout
+ * @param printStackTrace print stack trace when exception occurs
+ *
+ * @return JNI_OK for success, JNI_ERR for failure
*/
- private static void initPhase2() {
- // initialize the module system
- System.bootLayer = ModuleBootstrap.boot();
+ private static int initPhase2(boolean printToStderr, boolean printStackTrace) {
+ try {
+ bootLayer = ModuleBootstrap.boot();
+ } catch (Exception | Error e) {
+ logInitException(printToStderr, printStackTrace,
+ "Error occurred during initialization of boot layer", e);
+ return -1; // JNI_ERR
+ }
// module system initialized
VM.initLevel(2);
+
+ return 0; // JNI_OK
}
/*
* Invoked by VM. Phase 3 is the final system initialization:
* 1. set security manager
@@ -2032,10 +2078,13 @@
return bootLayer;
}
public ConcurrentHashMap<?, ?> createOrGetClassLoaderValueMap(ClassLoader cl) {
return cl.createOrGetClassLoaderValueMap();
}
+ public Class<?> defineClass(ClassLoader loader, String name, byte[] b, ProtectionDomain pd, String source) {
+ return ClassLoader.defineClass1(loader, name, b, 0, b.length, pd, source);
+ }
public Class<?> findBootstrapClassOrNull(ClassLoader cl, String name) {
return cl.findBootstrapClassOrNull(name);
}
public URL findResource(ClassLoader cl, String mn, String name) throws IOException {
return cl.findResource(mn, name);
< prev index next >