classpath
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Kissme-general] SystemClassLoader fix


From: John Leuner
Subject: Re: [Kissme-general] SystemClassLoader fix
Date: Tue, 2 Apr 2002 16:24:08 +0100
User-agent: Mutt/1.3.27i

> I cleaned your patch up a bit, and once I get it to compile, I'm
> committing it. Thanks for the catch - I documented that the class
> specified by java.system.class.loader must now have a constructor which
> accepts a parent class loader.

It wasn't really a patch, just a demonstration of the problem. 

Any reason why it wouldn't compile?

John Leuner


> John Leuner wrote:
> > 
> > I tracked this down to the ClassLoader class.
> > 
> > 
> > Otherwise getSystemClassLoader gets in an infinite loop where the 
> > Constructor for SystemClassLoader calls the ClassLoader() constructor which 
> > tries to use the system class loader as the parent classloader and round 
> > and round it goes ...
> > 
> > John Leuner
> > 
> 
> 2002-03-28  John Leuner  <address@hidden>
> 
>       * java/lang/ClassLoader.java (getSystemClassLoader): Break
>       infinite loop by specifying parent classloader.
>       * gnu/java/lang/SystemClassLoader.java (SystemClassLoader): Add
>       proper constructor.
> 
> -- 
> This signature intentionally left boring.
> 
> Eric Blake             address@hidden
>   BYU student, free software programmer
> Index: gnu/java/lang/SystemClassLoader.java
> ===================================================================
> RCS file: /cvsroot/classpath/classpath/gnu/java/lang/SystemClassLoader.java,v
> retrieving revision 1.1
> diff -u -r1.1 SystemClassLoader.java
> --- gnu/java/lang/SystemClassLoader.java      22 Mar 2002 21:25:20 -0000      
> 1.1
> +++ gnu/java/lang/SystemClassLoader.java      28 Mar 2002 21:36:04 -0000
> @@ -64,6 +64,17 @@
>  
>    /** Flag to avoid infinite loops. */
>    private static boolean is_trying;
> +
> +  /**
> +   * Creates a class loader. Note that the parent may be null, when this is
> +   * created as the system class loader by ClassLoader.getSystemClassLoader.
> +   *
> +   * @param parent the parent class loader
> +   */
> +  public SystemClassLoader(ClassLoader parent)
> +  {
> +    super(parent);
> +  }
>      
>    /**
>     * Get the URL to a resource.
> Index: java/lang/ClassLoader.java
> ===================================================================
> RCS file: /cvsroot/classpath/classpath/java/lang/ClassLoader.java,v
> retrieving revision 1.16
> diff -u -r1.16 ClassLoader.java
> --- java/lang/ClassLoader.java        22 Mar 2002 21:25:20 -0000      1.16
> +++ java/lang/ClassLoader.java        28 Mar 2002 21:36:05 -0000
> @@ -48,6 +48,7 @@
>  import java.util.Enumeration;
>  import java.util.HashMap;
>  import java.util.Map;
> +import gnu.java.lang.SystemClassLoader;
>  import gnu.java.util.DoubleEnumeration;
>  import gnu.java.util.EmptyEnumeration;
>  
> @@ -685,7 +686,8 @@
>     * property <code>java.class.path</code>. This is set as the context
>     * class loader for a thread. The system property
>     * <code>java.system.class.loader</code>, if defined, is taken to be the
> -   * name of the class to use as the system class loader, otherwise this
> +   * name of the class to use as the system class loader, which must have
> +   * a public constructor which takes a ClassLoader as a parent; otherwise 
> this
>     * uses gnu.java.lang.SystemClassLoader.
>     *
>     * <p>Note that this is different from the bootstrap classloader that
> @@ -713,12 +715,28 @@
>                                             
> "gnu.java.lang.SystemClassLoader");
>          try
>            {
> -            return (ClassLoader) Class.forName(loader).newInstance();
> +            // Give the new system class loader a null parent.
> +            Constructor c = Class.forName(loader).getConstructor
> +              ( new Class[] { ClassLoader.class } );
> +            return (ClassLoader) c.newInstance(new Object[1]);
>            }
>          catch (Exception e)
>            {
> -            throw (Error) new InternalError
> -              ("System class loader could not be found: " + e).initCause(e);
> +            try
> +              {
> +                System.err.println("Requested system classloader "
> +                                   + loader + " failed, trying "
> +                                   + "gnu.java.lang.SystemClassLoader");
> +                e.printStackTrace();
> +                // Fallback to gnu.java.lang.SystemClassLoader.
> +                return new SystemClassLoader(null);
> +              }
> +            catch (Exception e1)
> +              {
> +                throw (Error) new InternalError
> +                  ("System class loader could not be found: " + e)
> +                  .initCause(e);
> +              }
>            }
>        }
>      // Check if we may return the system classloader




reply via email to

[Prev in Thread] Current Thread [Next in Thread]