Uploaded image for project: 'Groovy'
  1. Groovy
  2. GROOVY-4720

Method overriding with ExpandoMetaClass is partially broken

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Critical
    • Resolution: Fixed
    • None
    • 1.8-rc-4, 1.9-beta-1, 1.7.11
    • None
    • None

    Description

      There is a regression whereby you cannot override methods using ExpandoMetaClass.

      The reason is that ClosureMetaMethod.createMethodList creates an anonymous inner class of type MetaMethod and adds it to the returned List<MetaMethod> that are to be registered

      Later the isNonRealMethod(MetaMethod) check in MetaMethodIndex does this check:

          private boolean isNonRealMethod(MetaMethod method) {
              return method instanceof NewInstanceMetaMethod ||
                      method instanceof NewStaticMetaMethod ||
                      method instanceof ClosureMetaMethod ||
                      method instanceof GeneratedMetaMethod ||
                      method instanceof ClosureStaticMetaMethod ||
                      method instanceof MixinInstanceMetaMethod;
          }
      

      Since the anonymous inner MetaMethod defined in ClosureMetaMethod is not an instance of any of these types then the method is never registered in the MetaMethodIndex:

                          if (methodC == matchC) {
                              if (isNonRealMethod(method)) {
                                  list.set(found, method);
                              }
      

      Attachments

        Activity

          People

            guillaume Guillaume Sauthier
            graemerocher Graeme Rocher
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: