< prev index next >
src/java.base/share/classes/java/lang/ClassLoader.java
Print this page
*** 57,66 ****
--- 57,67 ----
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Supplier;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
+ import jdk.internal.loader.BuiltinClassLoader;
import jdk.internal.perf.PerfCounter;
import jdk.internal.loader.BootLoader;
import jdk.internal.loader.ClassLoaders;
import jdk.internal.misc.Unsafe;
import jdk.internal.misc.VM;
*** 244,253 ****
--- 245,257 ----
private final String name;
// the unnamed module for this ClassLoader
private final Module unnamedModule;
+ // a string for exception message printing
+ private final String nameAndId;
+
/**
* Encapsulates the set of parallel capable loader types.
*/
private static class ParallelLoaders {
private ParallelLoaders() {}
*** 379,388 ****
--- 383,410 ----
// no finer-grained lock; lock on the classloader instance
parallelLockMap = null;
package2certs = new Hashtable<>();
assertionLock = this;
}
+ this.nameAndId = nameAndId(this);
+ }
+
+ /**
+ * If the defining loader has a name explicitly set then
+ * '<loader-name>' @<id>
+ * If the defining loader has no name then
+ * <qualified-class-name> @<id>
+ * If it's built-in loader then omit `@<id>` as there is only one instance.
+ */
+ private static String nameAndId(ClassLoader ld) {
+ String nid = ld.getName() != null ? "\'" + ld.getName() + "\'"
+ : ld.getClass().getName();
+ if (!(ld instanceof BuiltinClassLoader)) {
+ String id = Integer.toHexString(System.identityHashCode(ld));
+ nid = nid + " @" + id;
+ }
+ return nid;
}
/**
* Creates a new class loader of the specified name and using the
* specified parent class loader for delegation.
< prev index next >