Can't instantiate anonymous class more than 16 times

Wei Yin Teo weiyinteo at gmail.com
Mon Aug 10 12:56:21 PDT 2009


Hi,

After loading an anonymous class through the AnonymousClassLoader, I  
could construct the object by calling the newInstance on the class.  
But the 16th time failed. Here is the code and stack trace

class LoadingTest {

	public void testLoading() {
		AnonymousClassLoader acl = new AnonymousClassLoader();

		Class<?> testClass = acl.loadClass(getClassBytes());

		for (int i = 0; i < 100; i++) {
			try {
			testClass.newInstance();
			}
			catch(Throwable e) {
				System.out.println("failed at " + i);
				e.printStackTrace();
				throw e;
			}
		}
    }

    private byte[] getClassBytes() {
		ClassWriter cw = new ClassWriter(0);
		MethodVisitor mv;

		cw.visit(V1_7, ACC_PUBLIC + ACC_SUPER, "InstanceTest", null,
				"java/lang/Object", null);
		mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
		mv.visitCode();
		Label l0 = new Label();
		mv.visitLabel(l0);
		mv.visitVarInsn(ALOAD, 0);
		mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>",  
"()V");
		mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out",
				"Ljava/io/PrintStream;");
		mv.visitLdcInsn("constructed");
		mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println",
				"(Ljava/lang/String;)V");
		mv.visitInsn(RETURN);
		Label l1 = new Label();
		mv.visitLabel(l1);
		mv
				.visitLocalVariable("this",
						"Ltest/com/gs/s4j/misc/AnonymousClassLoading;", null,
						l0, l1, 0);
		mv.visitMaxs(2, 1);
		mv.visitEnd();
		cw.visitEnd();
	return cw.toByteArray():
   }
}

It appears at the 16th time, the JVM generate a ConstructorAccessor  
and it does not know how to handle anonymous class.

Thanks,
Wei

Here is the output from the code.
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
========================================================================
constructed
constructed
constructed
constructed
constructed
constructed
constructed
constructed
constructed
constructed
constructed
constructed
constructed
constructed
constructed
constructed
failed at 16
java.lang.NoClassDefFoundError: InstanceTest/7572081
	at sun.reflect.GeneratedConstructorAccessor3.newInstance(Unknown  
Source)
	at  
sun 
.reflect 
.DelegatingConstructorAccessorImpl 
.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:539)
	at java.lang.Class.newInstance0(Class.java:372)
	at java.lang.Class.newInstance(Class.java:325)
	at  
test 
.com 
.gs 
.s4j.misc.AnonymousClassLoading.testLoading(AnonymousClassLoading.java: 
47)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at  
sun 
.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java: 
57)
	at  
sun 
.reflect 
.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: 
43)
	at java.lang.reflect.Method.invoke(Method.java:623)
	at junit.framework.TestCase.runTest(TestCase.java:164)
	at junit.framework.TestCase.runBare(TestCase.java:130)
	at junit.framework.TestResult$1.protect(TestResult.java:106)
	at junit.framework.TestResult.runProtected(TestResult.java:124)
	at junit.framework.TestResult.run(TestResult.java:109)
	at junit.framework.TestCase.run(TestCase.java:120)
	at  
org 
.eclipse 
.jdt 
.internal 
.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java: 
130)
	at  
org 
.eclipse 
.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at  
org 
.eclipse 
.jdt 
.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java: 
467)
	at  
org 
.eclipse 
.jdt 
.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java: 
683)
	at  
org 
.eclipse 
.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java: 
390)
	at  
org 
.eclipse 
.pde 
.internal 
.junit.runtime.RemotePluginTestRunner.main(RemotePluginTestRunner.java: 
62)
	at  
org 
.eclipse 
.pde 
.internal 
.junit.runtime.CoreTestApplication.run(CoreTestApplication.java:23)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at  
sun 
.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java: 
57)
	at  
sun 
.reflect 
.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: 
43)
	at java.lang.reflect.Method.invoke(Method.java:623)
	at  
org 
.eclipse 
.equinox 
.internal 
.app 
.EclipseAppContainer.callMethodWithException(EclipseAppContainer.java: 
574)
	at  
org 
.eclipse 
.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
	at  
org 
.eclipse 
.core 
.runtime 
.internal 
.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
	at  
org 
.eclipse 
.core 
.runtime 
.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
	at  
org 
.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java: 
368)
	at  
org 
.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java: 
179)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at  
sun 
.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java: 
57)
	at  
sun 
.reflect 
.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: 
43)
	at java.lang.reflect.Method.invoke(Method.java:623)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:559)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:514)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1311)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1287)
Caused by: java.lang.ClassNotFoundException: InstanceTest.7572081
	at  
org 
.eclipse 
.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java: 
494)
	at  
org 
.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java: 
410)
	at  
org 
.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java: 
398)
	at  
org 
.eclipse 
.osgi 
.internal 
.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:105)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:331)
	... 41 more


-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/mlvm-dev/attachments/20090810/99d8a5d4/attachment.html 


More information about the mlvm-dev mailing list