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

Inconsistent metaClass capability for .static properties and methods vs ordinary dynamic properties and methods

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Open
    • Minor
    • Resolution: Unresolved
    • 3.0.9, 4.0.0-beta-2
    • None
    • Compiler
    • None

    Description

      runtime addition and working with static dynamic properties and methods is inconsistent and doesnt work the same as the equivalent capability for ordinary dynamic properties and methods.

      I've tried to show the problem in the script code below 

      package script
      
      class SomeClass {
      static String classDeclaredStatName = "in class definition static name"
      
      String name = "instance level name"
      }
      
      //add a new property to metaclass - works fine
      SomeClass.metaClass.dynProp = "dynamic property added"
      SomeClass.metaClass.dynMethod = \{"dynamic method added as closure"}
      
      SomeClass.metaClass.static.dynStaticProp = "dynamic static property added"
      SomeClass.metaClass.static.dynStaticMethod = \{"dynamic static method added"}
      
      assert SomeClass.classDeclaredStatName == "in class definition static name"
      assert SomeClass.dynStaticMethod() == "dynamic static method added"
      
      //this forces conversion of metaClassImpl to expandoMetaClass
      SomeClass myc = new SomeClass()
      
      assert myc.name == "instance level name"
      assert myc.classDeclaredStatName == "in class definition static name"
      assert myc.dynProp == "dynamic property added"
      assert myc.dynMethod() == "dynamic method added as closure"
      
      assert myc.dynStaticMethod() == "dynamic static method added"
      
      def res
      res = myc.metaClass.properties //returns list of metaBeanProperty
      
      res = myc.metaClass.getMetaMethods() //works and returns list of metaMethods
      
      //This is the only method for static's in MOP - this works but you have to know the name of the method in advance
      res = myc.metaClass.getStaticMetaMethod("dynStaticMethod", [] as ArrayList)
      
      //these functions are missing from MOP and would enable you to query for static props/methods 
      res = myc.metaClass.getStaticMetaMethods()     //this method doesnt exist in MOP api
      res = myc.metaClass.getStaticProperties()           //this method doesnt exist in MOP api either
      

      Attachments

        Activity

          People

            Unassigned Unassigned
            woodmawa William Woodman
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated: