123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- /* Copyright (C) 2005, 2006 Free Software Foundation
- This file is part of libgcj.
- This software is copyrighted work licensed under the terms of the
- Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
- details. */
- package gnu.gcj.runtime;
- import java.io.*;
- import java.lang.reflect.Field;
- import java.util.StringTokenizer;
- import java.util.HashMap;
- import java.net.URL;
- import java.net.URLClassLoader;
- public final class SystemClassLoader extends URLClassLoader
- {
- SystemClassLoader(ClassLoader parent)
- {
- super(new URL[0], parent);
- }
- // This holds all the "native" classes linked into the executable
- // and registered with this loader.
- private HashMap nativeClasses = new HashMap();
- // This is called to register a native class which was linked into
- // the application but which is registered with the system class
- // loader after the VM is initialized.
- void addClass(Class klass)
- {
- String packageName = null;
- String className = klass.getName();
- int lastDot = className.lastIndexOf('.');
- if (lastDot != -1)
- packageName = className.substring(0, lastDot);
- if (packageName != null && getPackage(packageName) == null)
- {
- // Should have some way to store this information in a
- // precompiled manifest.
- definePackage(packageName, null, null, null, null, null, null, null);
- }
-
- // Use reflection to access the package-private "loadedClasses" field.
- nativeClasses.put(className, klass);
- }
- protected native Class findClass(String name);
- // We add the URLs to the system class loader late. The reason for
- // this is that during bootstrap we don't want to parse URLs or
- // create URL connections, since that will result in circularities
- // causing a crash.
- void init()
- {
- String sep = File.pathSeparator;
- StringTokenizer st
- = new StringTokenizer (System.getProperty ("java.class.path", "."),
- sep, true);
- // Pretend we start with a ':', so if we see a ':' first we add
- // '.'.
- boolean last_was_sep = true;
- while (st.hasMoreElements ())
- {
- String e = st.nextToken ();
- try
- {
- if (sep.equals(e))
- {
- if (last_was_sep)
- {
- // We saw two separators in a row, so add ".".
- addURL(new URL("file", "", -1, "./"));
- last_was_sep = false;
- }
- else
- last_was_sep = true;
- continue;
- }
- last_was_sep = false;
- File path = new File(e);
- // Ignore invalid paths.
- if (!path.exists())
- continue;
- if (!e.endsWith (File.separator) && path.isDirectory ())
- addURL(new URL("file", "", -1, e + File.separator));
- else
- addURL(new URL("file", "", -1, e));
- }
- catch (java.net.MalformedURLException x)
- {
- // This should never happen.
- throw new RuntimeException(x);
- }
- }
- // If we saw a trailing ":", add "." to the path.
- if (last_was_sep)
- {
- try
- {
- addURL(new URL("file", "", -1, "./"));
- }
- catch (java.net.MalformedURLException x)
- {
- // This should never happen.
- throw new RuntimeException(x);
- }
- }
- }
- }
|