class UnloadedClass { } class C { public static final UnloadedClass unloaded_field = new UnloadedClass(); } class D { public static final UnloadedClass unloaded_field = new UnloadedClass(); } public class TestClassLoadingConstant { static class LoadedClass { } private static final LoadedClass loaded_field = new LoadedClass(); private static Object test(boolean flag, int l, Object o) { Object o2 = null; if (flag) { } else { o2 = D.unloaded_field; } Object o1 = C.unloaded_field; for (int i = 1; i < l ; i *= 2) { if (o1 == o) { return o2; } o1 = loaded_field; } return o1; } public static void main(String[] args) throws ClassNotFoundException, InterruptedException { Class.forName("D", false, TestClassLoadingConstant.class.getClassLoader()); Thread thread = new Thread() { public void run() { try { sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } C c = new C(); UnloadedClass unloaded = new UnloadedClass(); System.out.println("Class loaded"); } }; thread.start(); test(false, 2, null); } }