[ 
https://issues.apache.org/jira/browse/BCEL-137?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Emmanuel Bourg updated BCEL-137:
--------------------------------

         Priority: Blocker
      Environment:     (was: Operating System: All
Platform: All)
    Fix Version/s: 6.0
         Priority:   (was: P2)
         Severity:   (was: major)

> "Invalid method signature: TT;" when using MethodGen for a method having a 
> generic parameter
> --------------------------------------------------------------------------------------------
>
>                 Key: BCEL-137
>                 URL: https://issues.apache.org/jira/browse/BCEL-137
>             Project: Commons BCEL
>          Issue Type: Bug
>          Components: Main
>    Affects Versions: unspecified
>            Reporter: Enrico Gueli
>            Assignee: Apache Commons Developers
>            Priority: Blocker
>             Fix For: 6.0
>
>         Attachments: patch.txt
>
>
> 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.



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to