diff options
author | Mark Spruiell <mes@zeroc.com> | 2009-06-26 14:59:11 -0700 |
---|---|---|
committer | Mark Spruiell <mes@zeroc.com> | 2009-06-26 14:59:11 -0700 |
commit | 3a5f968f8487eb1f91769ab8704a9609dcbe9efe (patch) | |
tree | 469fc394f1e1e9ba0ef615c991faa524af4a21d0 /java/src/IceInternal/Util.java | |
parent | updating CHANGES for bug 4126 (diff) | |
download | ice-3a5f968f8487eb1f91769ab8704a9609dcbe9efe.tar.bz2 ice-3a5f968f8487eb1f91769ab8704a9609dcbe9efe.tar.xz ice-3a5f968f8487eb1f91769ab8704a9609dcbe9efe.zip |
more fixes for bug 4126
Diffstat (limited to 'java/src/IceInternal/Util.java')
-rw-r--r-- | java/src/IceInternal/Util.java | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/java/src/IceInternal/Util.java b/java/src/IceInternal/Util.java index 2a1f70ce69c..b55c23fdca5 100644 --- a/java/src/IceInternal/Util.java +++ b/java/src/IceInternal/Util.java @@ -59,4 +59,68 @@ public final class Util return stream; } + + public static Class<?> + findClass(String className) + throws LinkageError + { + Class<?> c = null; + + // + // Calling Class.forName() doesn't always work. For example, if Ice.jar is installed + // as an extension (in $JAVA_HOME/jre/lib/ext), calling Class.forName(name) uses the + // extension class loader, which will not look in CLASSPATH for the target class. + // + // First we try using the system class loader (which knows about CLASSPATH). Next we + // try the current thread's class loader, and finally we fall back to Class.forName(). + // + try + { + try + { + c = findClass(className, ClassLoader.getSystemClassLoader()); + } + catch(SecurityException ex) + { + } + + if(c == null) + { + try + { + c = findClass(className, Thread.currentThread().getContextClassLoader()); + } + catch(SecurityException ex) + { + } + } + + if(c == null) + { + c = Class.forName(className); + } + } + catch(ClassNotFoundException ex) + { + // Ignore + } + + return c; + } + + private static Class<?> + findClass(String className, ClassLoader cl) + throws LinkageError + { + try + { + return cl.loadClass(className); + } + catch(ClassNotFoundException ex) + { + // Ignore + } + + return null; + } } |