[
https://issues.apache.org/jira/browse/GROOVY-10392?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17464617#comment-17464617
]
Eric Milles commented on GROOVY-10392:
--------------------------------------
It is true about a number of Groovy features that they are not holistically
complete. That is the consequence of design by accretion. I'd guess that
static metaclass properties were added by someone hoping to solve a particular
problem and once that problem was solved the feature was developed no further.
I don't recommend using metaclass enhancements as a general-purpose tool. I
think it is good for testing or quick use in scripts. Production use cases
have tended to move towards traits or extension methods.
I'd like to understand what your goal is outside of meta properties, but since
every description has meta properties baked in, I cannot see the higher level.
Let's say this worked: "Type.metaClass.static.const = 'xyz'". Why would you
need this when you can add "def getConst()" as an extension method and get the
same experience, namely "assert Type.const == 'xyz'"? And any code that you
wanted to get at a fixed value could reference it from some other code you
control where you could just add a static member.
> 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)