From 160b3aeca1741fdf348ad3687fba23526bfe7ae1 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Sun, 16 Mar 2003 13:57:49 +0000 Subject: 2003-03-15 Jeroen Frijters * vm/reference/java/lang/VMClassLoader.java (loadClass): Changed documentation to make clear null can be returned to signal that the class wasn't found. * java/lang/ClassLoader.java (loadClass(String,boolean)): Added check for null return value from VMClassLoader.loadClass. * vm/reference/java/lang/Class.java (forName(String,boolean,ClassLoader)): Likewise. * NEWS: Add note about VM interface changes. --- ChangeLog | 12 +++++++++++- NEWS | 7 +++++++ java/lang/ClassLoader.java | 27 +++++++++++++++++---------- vm/reference/java/lang/Class.java | 5 ++++- vm/reference/java/lang/VMClassLoader.java | 6 ++++-- 5 files changed, 43 insertions(+), 14 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0afc0033d..21c4b8805 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2003-03-15 Jeroen Frijters + + * vm/reference/java/lang/VMClassLoader.java (loadClass): Changed + documentation to make clear null can be returned to signal that the + class wasn't found. + * java/lang/ClassLoader.java (loadClass(String,boolean)): Added check + for null return value from VMClassLoader.loadClass. + * vm/reference/java/lang/Class.java + (forName(String,boolean,ClassLoader)): Likewise. + * NEWS: Add note about VM interface changes. + 2003-03-15 Aaron M. Renn * java/io/FileOutputStream - Fix 1.4 compatibility issue @@ -37,7 +48,6 @@ (nativeReadBuf): offset, len to int, return int (nativeAvailable): return int - 2003-03-14 Michael Koch * java/beans/beancontext/BeanContextServicesSupport.java diff --git a/NEWS b/NEWS index 1b5e4243f..5c9bfacf3 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,10 @@ +New in release 0.06 (not-yet-released) +* VMClassLoader.loadClass(), the bootstrap classloader called by + Class.forName() and ClassLoader.loadClass(), may now return null when + a class is not found instead of throwing a new ClassNotFoundException. + This is a performance optimization in some cases. This also changes + the Class.forName() reference code. + New in release 0.05 (2003/02/15) * Supports free Java VMs Jikes RVM and Kissme out of the box, perhaps others. * Supports GNU Crypto 1.1 as the official provider of cryptographic primitives diff --git a/java/lang/ClassLoader.java b/java/lang/ClassLoader.java index 15e007d2a..f30a15f17 100644 --- a/java/lang/ClassLoader.java +++ b/java/lang/ClassLoader.java @@ -288,21 +288,28 @@ public abstract class ClassLoader if (c != null) return c; - // Can the class been loaded by a parent? + // Can the class be loaded by a parent? try + { + if (parent == null) { - if (parent == null) - return VMClassLoader.loadClass(name, resolve); - return parent.loadClass(name, resolve); + c = VMClassLoader.loadClass(name, resolve); + if (c != null) + return c; } - catch (ClassNotFoundException e) + else { - // Still not found, we have to do it ourself. - c = findClass(name); - if (resolve) - resolveClass(c); - return c; + 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; } /** diff --git a/vm/reference/java/lang/Class.java b/vm/reference/java/lang/Class.java index 1ed01eb01..de2b5b240 100755 --- a/vm/reference/java/lang/Class.java +++ b/vm/reference/java/lang/Class.java @@ -187,7 +187,10 @@ public final class Class implements Serializable if (cl != null) sm.checkPermission(new RuntimePermission("getClassLoader")); } - return VMClassLoader.loadClass(name, initialize); + Class c = VMClassLoader.loadClass(name, initialize); + if (c != null) + return c; + throw new ClassNotFoundException(name); } return classloader.loadClass(name, initialize); } diff --git a/vm/reference/java/lang/VMClassLoader.java b/vm/reference/java/lang/VMClassLoader.java index 77e2810c5..107f1745e 100644 --- a/vm/reference/java/lang/VMClassLoader.java +++ b/vm/reference/java/lang/VMClassLoader.java @@ -117,12 +117,14 @@ final class VMClassLoader * * @param name the class name to load * @param resolve whether to resolve it - * @return the class, loaded by the bootstrap classloader + * @return the class, loaded by the bootstrap classloader or null + * if the class wasn't found. Returning null is equivalent to throwing + * a ClassNotFoundException (but a possible performance optimization). */ static final Class loadClass(String name, boolean resolve) throws ClassNotFoundException { - throw new ClassNotFoundException(name); + return null; } /** -- cgit v1.2.1