Details

    • Type: Sub-task
    • Status: Closed
    • Priority: Major
    • Resolution: Invalid
    • Affects Version/s: 2.4.5
    • Fix Version/s: None
    • Component/s: class generator
    • Labels:
      None

      Description

      The class names generated for closures in inner classes break Class.getSimpleName()

      For example, the closure passed to .each in this example has name Example$_Inner_closure1.class:

      public class Example {
          private class Inner {
              def _ = [1, 2, 3].each {}
          }
      }
      

      Calling getSimpleName() on this class (e.g. as done by Weld on startup) throws a java.lang.InternalError:

      Caused by: java.lang.InternalError: Malformed class name
      	at java.lang.Class.getSimpleName(Class.java:1133) [:1.6.0_29]
      	at java.lang.Class.isAnonymousClass(Class.java:1188) [:1.6.0_29]
      

      I believe the class name is expected to be in the format Example$Inner$closure1.

      I've attached a test case to demonstrate the problem - extract the archive, cd to groovy-closure-classname-test and run mvn test. The test uses Weld to inject a ClosureClassNameTest instance, but fails when Weld calls getSimpleName() on the class for the closure on line 10.

        Attachments

          Issue Links

            Activity

              People

              • Assignee:
                Unassigned
                Reporter:
                sjcorbett Sam Corbett
              • Votes:
                0 Vote for this issue
                Watchers:
                3 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: