Uploaded image for project: 'Groovy'
  1. Groovy
  2. GROOVY-5989 Inner Class Issues
  3. GROOVY-7757

Malformed class names for closures in inner classes

    XMLWordPrintableJSON

Details

    • Sub-task
    • Status: Closed
    • Major
    • Resolution: Invalid
    • 2.4.5
    • None
    • class generator
    • 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

              Unassigned Unassigned
              sjcorbett Samuel James Corbett
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: