package com.querydsl.core; import java.net.URL; import java.net.URLClassLoader; import java.util.Collection; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.reflections.util.ClasspathHelper; import com.querydsl.core.testutil.ThreadSafety; public class CycleClassInitDependencyTest { private static ClassLoader loader; @BeforeClass public static void overrideClassLoader() { loader = Thread.currentThread().getContextClassLoader(); Collection<URL> urls = ClasspathHelper.forClassLoader(); ClassLoader cl = URLClassLoader.newInstance(urls.toArray(new URL[urls.size()]), null/*no delegation*/); Thread.currentThread().setContextClassLoader(cl); } @AfterClass public static void resetClassLoader() { Thread.currentThread().setContextClassLoader(loader); } @Test(timeout = 2000) public void test() { // each thread wants to load one part of the dependency circle ThreadSafety.check( new LoadClassRunnable("com.querydsl.core.types.dsl.NumberExpression"), new LoadClassRunnable("com.querydsl.core.types.dsl.Expressions")); } private static class LoadClassRunnable implements Runnable { private final String classToLoad; public LoadClassRunnable(String classToLoad) { this.classToLoad = classToLoad; } @Override public void run() { try { Class.forName(classToLoad, true, Thread.currentThread().getContextClassLoader()); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } } } }