if (JLI_IsTraceLauncher()) { end = CounterGet(); printf("%ld micro seconds to load main class\n", (long)(jint)Counter2Micros(end-start)); printf("----%s----\n", JLDEBUG_ENV_ENTRY); }
// Java libraries should ensure that name is never null... if (name == NULL || (int)strlen(name) > Symbol::max_length()) { // It's impossible to create this class; the name cannot fit // into the constant pool. return NULL; }
TempNewSymbol h_name = SymbolTable::new_symbol(name, CHECK_NULL); Klass* k = SystemDictionary::resolve_or_null(h_name, CHECK_NULL); if (k == NULL) { return NULL; }
if (TraceClassResolution) { trace_class_resolution(k); } return (jclass) JNIHandles::make_local(env, k->java_mirror()); JVM_END
public class Launcher { private static URLStreamHandlerFactory factory = new Factory(); private static Launcher launcher = new Launcher(); private static String bootClassPath = System.getProperty("sun.boot.class.path");
public static Launcher getLauncher() { return launcher; }
private ClassLoader loader;
public Launcher() { // Create the extension class loader ClassLoader extcl; try { extcl = ExtClassLoader.getExtClassLoader(); } catch (IOException e) { throw new InternalError( "Could not create extension class loader", e); }
// Now create the class loader to use to launch the application try { loader = AppClassLoader.getAppClassLoader(extcl); } catch (IOException e) { throw new InternalError( "Could not create application class loader", e); }
// Also set the context class loader for the primordial thread. Thread.currentThread().setContextClassLoader(loader); ……
4、扩展类加载器的创建流程
1 2 3 4 5 6 7 8 9 10 11 12
public static ExtClassLoader getExtClassLoader() throws IOException { …… return new ExtClassLoader(dirs); …… public ExtClassLoader(File[] dirs) throws IOException { super(getExtURLs(dirs), null, factory); } URLClassLoader(URL[] urls, ClassLoader parent, AccessControlContext acc) {
public static ClassLoader getAppClassLoader(final ClassLoader extcl) throws IOException { final String s = System.getProperty("java.class.path"); final File[] path = (s == null) ? new File[0] : getClassPath(s);
// Note: on bugid 4256530 // Prior implementations of this doPrivileged() block supplied // a rather restrictive ACC via a call to the private method // AppClassLoader.getContext(). This proved overly restrictive // when loading classes. Specifically it prevent // accessClassInPackage.sun.* grants from being honored. // return AccessController.doPrivileged( new PrivilegedAction<AppClassLoader>() { public AppClassLoader run() { URL[] urls = (s == null) ? new URL[0] : pathToURLs(path); return new AppClassLoader(urls, extcl); } }); } AppClassLoader(URL[] urls, ClassLoader parent) { super(urls, parent, factory); }