summaryrefslogtreecommitdiff
path: root/java/src/IceInternal/Util.java
diff options
context:
space:
mode:
authorMark Spruiell <mes@zeroc.com>2009-06-26 14:59:11 -0700
committerMark Spruiell <mes@zeroc.com>2009-06-26 14:59:11 -0700
commit3a5f968f8487eb1f91769ab8704a9609dcbe9efe (patch)
tree469fc394f1e1e9ba0ef615c991faa524af4a21d0 /java/src/IceInternal/Util.java
parentupdating CHANGES for bug 4126 (diff)
downloadice-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.java64
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;
+ }
}