diff options
Diffstat (limited to 'libjava/java/lang/ClassLoader.java')
-rw-r--r-- | libjava/java/lang/ClassLoader.java | 52 |
1 files changed, 31 insertions, 21 deletions
diff --git a/libjava/java/lang/ClassLoader.java b/libjava/java/lang/ClassLoader.java index 46e523c6834..a4ac1e1b301 100644 --- a/libjava/java/lang/ClassLoader.java +++ b/libjava/java/lang/ClassLoader.java @@ -109,7 +109,7 @@ import java.util.Map; * * @author John Keiser * @author Mark Wielaard - * @author Eric Blake <ebb9@email.byu.edu> + * @author Eric Blake (ebb9@email.byu.edu) * @see Class * @since 1.0 * @status still missing 1.4 functionality @@ -260,6 +260,9 @@ public abstract class ClassLoader return loadClass(name, false); } + private native Class loadClassFromSig(String name) + throws ClassNotFoundException; + /** * Load a class using this ClassLoader or its parent, possibly resolving * it as well using <code>resolveClass()</code>. It first tries to find @@ -283,30 +286,37 @@ public abstract class ClassLoader protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException { - // Have we already loaded this class? - Class c = findLoadedClass(name); - if (c != null) - return c; - - // Can the class be loaded by a parent? - try + // Arrays are handled specially. + Class c; + if (name.charAt(0) == '[') + c = loadClassFromSig(name); + else { - if (parent == null) + // Have we already loaded this class? + c = findLoadedClass(name); + if (c == null) { - c = VMClassLoader.loadClass(name, resolve); - if (c != null) - return c; + // Can the class be loaded by a parent? + try + { + if (parent == null) + { + c = VMClassLoader.loadClass(name, resolve); + if (c != null) + return c; + } + else + { + return parent.loadClass(name, resolve); + } + } + catch (ClassNotFoundException e) + { + } + // Still not found, we have to do it ourself. + c = findClass(name); } - else - { - return parent.loadClass(name, resolve); - } - } - catch (ClassNotFoundException e) - { } - // Still not found, we have to do it ourself. - c = findClass(name); if (resolve) resolveClass(c); return c; |