You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Emmanuel Bourg (JIRA)" <ji...@apache.org> on 2014/04/24 10:31:19 UTC
[jira] [Updated] (BCEL-137) "Invalid method signature: TT;" when
using MethodGen for a method having a generic parameter
[ 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)