On 08/08/2011 10:46 AM, David Holmes wrote:
Hi Max,

Weijun Wang said the following on 08/06/11 00:19:
I have two files: A.java and B.java

/*
* @test
* @build A B
* @run main A
*/
public class A {
public static void main(String[] args) throws Exception {
Class.forName("B", true, Thread.currentThread().getContextClassLoader());
}
}

public class B {
}

Now jtreg A.java shows:

java.lang.ClassNotFoundException: B

How can I get B visible in A's ContextClassLoader?

It isn't A's context class loader it is the current threads. If the
above isn't working then either:

a) A is not being loaded by the application (aka system) classloader
(jtreg is using a custom loader); or
b) jtreg has explicitly changed the current thread's context classloader

You would need to investigate what A.class.getClassLoader() reports, and
what Thread.currentThread().getContextClassLoader() reports.

A.class.getClassLoader(): A URLClassLoader looking at JTwork/classes/test_location and $TESTSRC.

Thread.currentThread().getContextClassLoader(): A sun.misc.Launcher$AppClassLoader looking at jtreg.jar. It is also the parent class loader of A.class.getClassLoader().

BTW, I've added

            Thread.currentThread().setContextClassLoader(
                    A.class.getClassLoader());

to the test to make it pass.


Don't tell me to change to Class.forName("B"), that line is copied
from JDK that is called by a real test.

Or, the JDK code itself is problematic and it should fallback to
another ClassLoader?

It's unclear why the code/test needs to use the context classloader here
(or why/how it knows the context loader is the correct loader).

I'm not sure.

Thanks
Max


Cheers,
David

Thanks
Max

Reply via email to