printf in ClassLoader constructor causes java.lang.Error: java.lang.IllegalStateException: recursive invocation

Xerxes Rånby xerxes at zafena.se
Wed Mar 23 08:53:36 PDT 2011


Hi all, I am observing a spooky issue while working on a small classloader.
In the classloader constructor, im able to use
System.out.println
while
System.out.printf causes an exception

Is this an OpenJDK library bug or have I forgotten something crucial in my loader?

Testcase:

import java.io.File;

public class PrintfClassLoader extends ClassLoader {

    public PrintfClassLoader(ClassLoader parent) {
        this(parent, defaultFiles());
    }

    public PrintfClassLoader(ClassLoader parent, File[] files) {
        super(parent);
        System.out.println("Initializing Printf classloader....");

        // This  printf line are causing an exception... why???
        System.out.printf("I am the Printf classloader!");
    }

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        throw new ClassNotFoundException(name);
    }

    private static File[] defaultFiles() {
        return new File[0];
    }
}


javac PrintfClassLoader.java
java -Djava.system.class.loader=PrintfClassLoader
Initializing Printf classloader....
Error occurred during initialization of VM
java.lang.Error: java.lang.IllegalStateException: recursive invocation
    at java.lang.ClassLoader.initSystemClassLoader(ClassLoader.java:1323)
    at java.lang.ClassLoader.getSystemClassLoader(ClassLoader.java:1286)
Caused by: java.lang.IllegalStateException: recursive invocation
    at java.lang.ClassLoader.initSystemClassLoader(ClassLoader.java:1303)
    at java.lang.ClassLoader.getSystemClassLoader(ClassLoader.java:1286)
    at java.util.ServiceLoader.loadInstalled(ServiceLoader.java:520)
    at sun.util.LocaleServiceProviderPool$1.run(LocaleServiceProviderPool.java:118)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.util.LocaleServiceProviderPool.<init>(LocaleServiceProviderPool.java:116)
    at sun.util.LocaleServiceProviderPool.getPool(LocaleServiceProviderPool.java:98)
    at java.text.DecimalFormatSymbols.getInstance(DecimalFormatSymbols.java:147)
    at java.util.Formatter.setZero(Formatter.java:2212)
    at java.util.Formatter.init(Formatter.java:1838)
    at java.util.Formatter.<init>(Formatter.java:1868)
    at java.io.PrintStream.format(PrintStream.java:936)
    at java.io.PrintStream.printf(PrintStream.java:838)
    at PrintfClassLoader.<init>(PrintfClassLoader.java:14)
    at PrintfClassLoader.<init>(PrintfClassLoader.java:6)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
    at java.lang.SystemClassLoaderAction.run(ClassLoader.java:2016)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.lang.ClassLoader.initSystemClassLoader(ClassLoader.java:1311)
    at java.lang.ClassLoader.getSystemClassLoader(ClassLoader.java:1286)

Cheers
Xerxes



More information about the distro-pkg-dev mailing list