package compiler.profiling.spectrapredefineclass_classloaders; import java.lang.reflect.Method; public class Test { public boolean m1(A a, Boolean early_return) { if (early_return.booleanValue()) return true; boolean res = m2(a); return res; } public boolean m2(A a) { boolean res = false; if (a.getClass() == B.class) { a.m(); } else { res = true; } return res; } public void m3(ClassLoader loader) throws Exception { String packageName = Test.class.getPackage().getName(); Class Test_class = loader.loadClass(packageName + ".Test"); Object test = Test_class.newInstance(); Class A_class = loader.loadClass(packageName + ".A"); Object a = A_class.newInstance(); Class B_class = loader.loadClass(packageName + ".B"); Object b = B_class.newInstance(); Method m1 = Test_class.getMethod("m1", A_class, Boolean.class); // So we don't hit uncommon trap in the next loop for (int i = 0; i < 4000; i++) { m4(m1, test, a, Boolean.TRUE); m4(m1, test, b, Boolean.TRUE); } for (int i = 0; i < 20000; i++) { m4(m1, test, a, Boolean.FALSE); } for (int i = 0; i < 4; i++) { m4(m1, test, b, Boolean.FALSE); } } public Object m4(Method m, Object test, Object a, Object early_return) throws Exception { return m.invoke(test, a, early_return); } static public A a = new A(); static public B b = new B(); }