DO NOT REPLY [Bug 48279] New: "Invalid method signature: TT;" when using MethodGen for a method having a generic parameter
[email protected] Wed, 25 Nov 2009 00:16:18 -0800 (PST)
| Newsgroups | gmane.comp.jakarta.bcel.devel |
|---|---|
| Message-ID | <[email protected]/bugzilla/> |
https://issues.apache.org/bugzilla/show_bug.cgi?id=48279
Summary: "Invalid method signature: TT;" when using MethodGen
for a method having a generic parameter
Product: BCEL
Version: unspecified
Platform: All
OS/Version: All
Status: NEW
Severity: major
Priority: P2
Component: Main
AssignedTo: [email protected]
ReportedBy: [email protected]
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.
--
Configure bugmail: https://issues.apache.org/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.