74 * Modules are defined to the ClassLoader by invoking the {@link #loadModule}
75 * method. Defining a module to this ClassLoader has the effect of making the
76 * types in the module visible. </p>
77 *
78 * <p> This ClassLoader also supports loading of classes and resources from a
79 * class path of URLs that are specified to the ClassLoader at construction
80 * time. The class path may expand at runtime (the Class-Path attribute in JAR
81 * files or via instrumentation agents). </p>
82 *
83 * <p> The delegation model used by this ClassLoader differs to the regular
84 * delegation model. When requested to load a class then this ClassLoader first
85 * maps the class name to its package name. If there is a module defined to a
86 * BuiltinClassLoader containing this package then the class loader delegates
87 * directly to that class loader. If there isn't a module containing the
88 * package then it delegates the search to the parent class loader and if not
89 * found in the parent then it searches the class path. The main difference
90 * between this and the usual delegation model is that it allows the platform
91 * class loader to delegate to the application class loader, important with
92 * upgraded modules defined to the platform class loader.
93 */
94
95 public class BuiltinClassLoader
96 extends SecureClassLoader
97 {
98 static {
99 if (!ClassLoader.registerAsParallelCapable())
100 throw new InternalError("Unable to register as parallel capable");
101 }
102
103 // parent ClassLoader
104 private final BuiltinClassLoader parent;
105
106 // the URL class path or null if there is no class path
107 private final URLClassPath ucp;
108
109
110 /**
111 * A module defined/loaded by a built-in class loader.
112 *
113 * A LoadedModule encapsulates a ModuleReference along with its CodeSource
114 * URL to avoid needing to create this URL when defining classes.
115 */
116 private static class LoadedModule {
117 private final BuiltinClassLoader loader;
118 private final ModuleReference mref;
119 private final URL codeSourceURL; // may be null
120
121 LoadedModule(BuiltinClassLoader loader, ModuleReference mref) {
122 URL url = null;
123 if (mref.location().isPresent()) {
124 try {
125 url = mref.location().get().toURL();
126 } catch (MalformedURLException | IllegalArgumentException e) { }
|
74 * Modules are defined to the ClassLoader by invoking the {@link #loadModule}
75 * method. Defining a module to this ClassLoader has the effect of making the
76 * types in the module visible. </p>
77 *
78 * <p> This ClassLoader also supports loading of classes and resources from a
79 * class path of URLs that are specified to the ClassLoader at construction
80 * time. The class path may expand at runtime (the Class-Path attribute in JAR
81 * files or via instrumentation agents). </p>
82 *
83 * <p> The delegation model used by this ClassLoader differs to the regular
84 * delegation model. When requested to load a class then this ClassLoader first
85 * maps the class name to its package name. If there is a module defined to a
86 * BuiltinClassLoader containing this package then the class loader delegates
87 * directly to that class loader. If there isn't a module containing the
88 * package then it delegates the search to the parent class loader and if not
89 * found in the parent then it searches the class path. The main difference
90 * between this and the usual delegation model is that it allows the platform
91 * class loader to delegate to the application class loader, important with
92 * upgraded modules defined to the platform class loader.
93 */
94 public class BuiltinClassLoader
95 extends SecureClassLoader
96 {
97 static {
98 if (!ClassLoader.registerAsParallelCapable())
99 throw new InternalError("Unable to register as parallel capable");
100 }
101
102 /** parent ClassLoader */
103 private final BuiltinClassLoader parent;
104
105 /** the URL class path, or null if there is no class path */
106 private final URLClassPath ucp;
107
108
109 /**
110 * A module defined/loaded by a built-in class loader.
111 *
112 * A LoadedModule encapsulates a ModuleReference along with its CodeSource
113 * URL to avoid needing to create this URL when defining classes.
114 */
115 private static class LoadedModule {
116 private final BuiltinClassLoader loader;
117 private final ModuleReference mref;
118 private final URL codeSourceURL; // may be null
119
120 LoadedModule(BuiltinClassLoader loader, ModuleReference mref) {
121 URL url = null;
122 if (mref.location().isPresent()) {
123 try {
124 url = mref.location().get().toURL();
125 } catch (MalformedURLException | IllegalArgumentException e) { }
|