我尝试将属性动态添加到继承自一个公共类的类型的实例中。为了使用户更简单,我想在超类中创建一个助手方法:
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此代码打印:
4
4但是,如果使用"add“方法,我直接在实例上设置元属性:
a.metaClass.other = 5
b.metaClass.other = 4
println a.other
println b.other它打印:
5
4例如,我知道没有一个元类,但是每个层次结构类都有自己的。有没有办法获得子类的元类,还是我完全错过了这个想法?
更新
如果我添加子类:
{
super.setMetaClass(metaClass)
}这似乎是可行的,但我宁愿避免它。
我看到metaClass的子类型如下所示:
org.codehaus.groovy.runtime.HandleMetaClass@25b53784[groovy.lang.ExpandoMetaClass@25b53784[class X]]和超级型metaClass:
groovy.lang.ExpandoMetaClass@25b53784[class X]发布于 2020-04-15 19:21:24
如果要使用父类metaClass,则需要使用super.metaClass而不是this.metaClass访问它,如下所示:
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输出:
$ groovy test.groovy
5
4或者,您可以使用在this.metaClass中工作良好的特性(属性将add方法添加到实现特征的类中,因此this.metaClass在该上下文中按预期工作)。
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.otherhttps://stackoverflow.com/questions/61235483
复制相似问题