首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取子类型的metaClass

获取子类型的metaClass
EN

Stack Overflow用户
提问于 2020-04-15 18:00:50
回答 1查看 110关注 0票数 1

我尝试将属性动态添加到继承自一个公共类的类型的实例中。为了使用户更简单,我想在超类中创建一个助手方法:

代码语言:javascript
复制
class Super {
    void add(String propertyName, Object value) {
        this.metaClass."$propertyName" = value
    }
}

class X extends Super {
    String name
    int value
}

X a = new X(name: 'a', value: 4)
X b = new X(name: 'b', value: 5)

a.add('other', 5)
b.add('other', 4)

println a​​.other
println b.other​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

此代码打印:

代码语言:javascript
复制
4
4

但是,如果使用"add“方法,我直接在实例上设置元属性:

代码语言:javascript
复制
a.metaClass.other = 5
b.metaClass.other = 4

println a​​.other
println b.other​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

它打印:

代码语言:javascript
复制
5
4

例如,我知道没有一个元类,但是每个层次结构类都有自己的。有没有办法获得子类的元类,还是我完全错过了这个想法?

更新

如果我添加子类:

代码语言:javascript
复制
    {
        super.setMetaClass(metaClass)
    }

这似乎是可行的,但我宁愿避免它。

我看到metaClass的子类型如下所示:

代码语言:javascript
复制
org.codehaus.groovy.runtime.HandleMetaClass@25b53784[groovy.lang.ExpandoMetaClass@25b53784[class X]]

和超级型metaClass:

代码语言:javascript
复制
groovy.lang.ExpandoMetaClass@25b53784[class X]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-15 19:21:24

如果要使用父类metaClass,则需要使用super.metaClass而不是this.metaClass访问它,如下所示:

代码语言:javascript
复制
class Super {
    void add(String propertyName, Object value) {
        super.metaClass."$propertyName" = value
    }
}

class X extends Super {
    String name
    int value
}

X a = new X(name: 'a', value: 4)
X b = new X(name: 'b', value: 5)

a.add('other', 5)
b.add('other', 4)

println a.other
println b.other

输出:

代码语言:javascript
复制
$ groovy test.groovy
5
4

或者,您可以使用在this.metaClass中工作良好的特性(属性将add方法添加到实现特征的类中,因此this.metaClass在该上下文中按预期工作)。

代码语言:javascript
复制
trait Super {
    void add(String propertyName, Object value) {
        this.metaClass."$propertyName" = value
    }
}

class X implements Super {
    String name
    int value
}

X a = new X(name: 'a', value: 4)
X b = new X(name: 'b', value: 5)

a.add('other', 5)
b.add('other', 4)

println a.other
println b.other
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61235483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档