You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Eric Milles (Jira)" <ji...@apache.org> on 2021/12/17 14:30:00 UTC

[jira] [Updated] (GROOVY-10392) Inconsistent metaClass capability for .static properties and methods vs ordinary dynamic properties and methods

     [ https://issues.apache.org/jira/browse/GROOVY-10392?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Eric Milles updated GROOVY-10392:
---------------------------------
    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 
{code:groovy}
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
{code}

  was:
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

 


> Inconsistent metaClass capability for .static properties and methods vs ordinary dynamic properties and methods  
> -----------------------------------------------------------------------------------------------------------------
>
>                 Key: GROOVY-10392
>                 URL: https://issues.apache.org/jira/browse/GROOVY-10392
>             Project: Groovy
>          Issue Type: Improvement
>          Components: Compiler
>    Affects Versions: 3.0.9, 4.0.0-beta-2
>            Reporter: William Woodman
>            Priority: Minor
>             Fix For: 3.x, 4.x
>
>
> 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 
> {code:groovy}
> 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
> {code}



--
This message was sent by Atlassian Jira
(v8.20.1#820001)