diff options
author | Mark Spruiell <mes@zeroc.com> | 2009-06-26 11:48:27 -0700 |
---|---|---|
committer | Mark Spruiell <mes@zeroc.com> | 2009-06-26 11:48:27 -0700 |
commit | b2485dc03241723460ea19e2b3ce7746fd805dad (patch) | |
tree | adabe0e91d7d173ca4678cecd46be299181784fd /java/src/IceInternal/BasicStream.java | |
parent | Added mcpp 2.7.2 patches (diff) | |
download | ice-b2485dc03241723460ea19e2b3ce7746fd805dad.tar.bz2 ice-b2485dc03241723460ea19e2b3ce7746fd805dad.tar.xz ice-b2485dc03241723460ea19e2b3ce7746fd805dad.zip |
bug 4126 - class loader issue causes UnmarshalOutOfBoundsException
Diffstat (limited to 'java/src/IceInternal/BasicStream.java')
-rw-r--r-- | java/src/IceInternal/BasicStream.java | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/java/src/IceInternal/BasicStream.java b/java/src/IceInternal/BasicStream.java index 19b9cbf82d8..25d40228962 100644 --- a/java/src/IceInternal/BasicStream.java +++ b/java/src/IceInternal/BasicStream.java @@ -2358,9 +2358,58 @@ public class BasicStream getConcreteClass(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 = getConcreteClass(className, ClassLoader.getSystemClassLoader()); + } + catch(SecurityException ex) + { + } + + if(c == null) + { + try + { + c = getConcreteClass(className, Thread.currentThread().getContextClassLoader()); + } + catch(SecurityException ex) + { + } + } + + if(c == null) + { + c = Class.forName(className); + } + } + catch(ClassNotFoundException ex) + { + // Ignore + } + + return c; + } + + private Class<?> + getConcreteClass(String className, ClassLoader cl) + throws LinkageError + { try { - Class<?> c = Class.forName(className); + Class<?> c = cl.loadClass(className); + // // Ensure the class is instantiable. The constants are // defined in the JVM specification (0x200 = interface, |