Bug 48279 - "Invalid method signature: TT;" when using MethodGen for a method having a generic parameter
Summary: "Invalid method signature: TT;" when using MethodGen for a method having a ge...
Status: RESOLVED FIXED
Alias: None
Product: BCEL - Now in Jira
Classification: Unclassified
Component: Main (show other bugs)
Version: unspecified
Hardware: All All
: P2 major
Target Milestone: ---
Assignee: issues@commons.apache.org
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2009-11-25 00:16 UTC by Enrico Gueli
Modified: 2010-01-10 12:21 UTC (History)
0 users



Attachments
a patch for this bug (552 bytes, patch)
2009-11-25 04:51 UTC, Enrico Gueli
Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Enrico Gueli 2009-11-25 00:16:15 UTC
The following code throws a "ClassFormatException: Invalid method signature: TT;" when executed:
===========================================================

import org.apache.bcel.Repository;
import org.apache.bcel.classfile.JavaClass;
import org.apache.bcel.classfile.Method;
import org.apache.bcel.generic.ConstantPoolGen;
import org.apache.bcel.generic.MethodGen;

class MyClassLoader extends ClassLoader {
	@Override
	public Class<?> loadClass(String name) throws ClassNotFoundException {
		if (name.startsWith("java.lang"))
			return super.loadClass(name);

		JavaClass jcl;
		jcl = Repository.lookupClass(name);
		scanMethods(jcl);
		byte[] data = jcl.getBytes();
		return defineClass(name, data, 0, data.length);
	}

	private void scanMethods(JavaClass jcl) {
		ConstantPoolGen cpg = new ConstantPoolGen(jcl.getConstantPool());
		Method[] methods = jcl.getMethods();
		for (int i = 0; i < methods.length; i++) {
			MethodGen mg = new MethodGen(methods[i], jcl.getClassName(), cpg);
		}
	}
}

class Foo<T> {
	public void bar(T x) {
	}
}

public class MethSignTest {
	public MethSignTest() {
		Foo<Integer> foo = new Foo<Integer>();
	}

	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		try {
			MyClassLoader mcl = new MyClassLoader();
			Class<MethSignTest> c = (Class<MethSignTest>) mcl
					.loadClass(MethSignTest.class.getName());
			c.newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}
===========================================================

Here's the full stack trace:

org.apache.bcel.classfile.ClassFormatException: Invalid method signature: TT;
	at org.apache.bcel.classfile.Utility.typeOfSignature(Utility.java:986)
	at org.apache.bcel.generic.Type.getType(Type.java:169)
	at org.apache.bcel.generic.MethodGen.<init>(MethodGen.java:255)
	at methodsignature.MyClassLoader.scanMethods(MethSignTest.java:26)
	at methodsignature.MyClassLoader.loadClass(MethSignTest.java:17)
	at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
	at methodsignature.MethSignTest.<init>(MethSignTest.java:38)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:501)
	at java.lang.Class.newInstance0(Class.java:350)
	at java.lang.Class.newInstance(Class.java:303)
	at methodsignature.MethSignTest.main(MethSignTest.java:47)

This misbehaviour occurs at least since revision 617860.
Comment 1 Enrico Gueli 2009-11-25 04:51:58 UTC
Created attachment 24610 [details]
a patch for this bug

It looks like this is due to an unsupported (and undocumented in the JLS) "T" signature character, representing a generic type. The problem disappears with the attached patch.
Comment 2 Torsten Curdt 2010-01-10 12:21:59 UTC
Thx! Applied.