首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Groovy Expando Metaclass设置程序访问

Groovy Expando Metaclass设置程序访问
EN

Stack Overflow用户
提问于 2017-08-11 03:04:26
回答 1查看 59关注 0票数 0

我用一个虚拟的Employee groovy类编写了以下测试。

代码语言:javascript
复制
@Test
void returnPropertyIfPropertyIsAvailableOnMetaClass(){
    def emp=new Employee()
    emp.metaClass.sayGutenAbend="Guten Abend"
    assert emp.sayGutenAbend=="Guten Abend"
    assert emp.sayGutenAbend==emp.metaClass.getProperty(emp,"sayGutenAbend")
    emp.metaClass.setProperty(emp,"sayGutenAbend","Guten Morgen")
    assert emp.sayGutenAbend=="Guten Morgen"
    assert emp.sayGutenAbend==emp.metaClass.getProperty(emp,"sayGutenAbend");
}

上面的测试通过了,下面的测试失败了-

代码语言:javascript
复制
@Test
void returnPropertyIfPropertyIsAvailableOnMetaClass_Fails(){
    def emp=new Employee()
    emp.metaClass.sayGutenAbend="Guten Abend"
    assert emp.sayGutenAbend=="Guten Abend"
    assert emp.sayGutenAbend==emp.metaClass.getProperty(emp,"sayGutenAbend")
    emp.metaClass.sayGutenAbend="Guten Morgen"
    assert emp.sayGutenAbend=="Guten Morgen"
    assert emp.sayGutenAbend==emp.metaClass.getProperty(emp,"sayGutenAbend")
}

与前面的代码示例唯一的区别是,为元类上的相同属性设置了一个新值。只是好奇而已。有人能告诉我为什么会这样吗?

EN

回答 1

Stack Overflow用户

发布于 2017-08-11 05:05:20

使用元编程创建字段后,不需要使用metaClass对其进行重置

代码语言:javascript
复制
class Employee{}

def emp = new Employee()

emp.metaClass.sayGutenAbend="Guten Abend"
assert emp.sayGutenAbend=="Guten Abend"
assert emp.sayGutenAbend==emp.metaClass.getProperty(emp,"sayGutenAbend")

emp.sayGutenAbend="Guten Nacht"
assert emp.sayGutenAbend=="Guten Nacht"
assert emp.sayGutenAbend==emp.metaClass.getProperty(emp,"sayGutenAbend")

我猜测这是由于元类的某一部分被重新创建,而您想要的是更改绑定到对象实例的元类。This answer可能与此有关。

在此代码片段中,重置该属性将创建一个新的ThreadManagedMetaBeanProperty,因此,此操作失败:

代码语言:javascript
复制
class Employee{}

def emp = new Employee()
emp.metaClass.sayGutenAbend="Guten Abend"

def metaclass1 = emp.metaClass.properties[1]
emp.metaClass.sayGutenAbend="Guten Nacht"

def metaclass2 = emp.metaClass.properties[1]

assert metaclass1 == metaclass2 // fails

在此过程中:

代码语言:javascript
复制
class Employee{}

def emp = new Employee()
emp.metaClass.sayGutenAbend="Guten Abend"

def metaclass1 = emp.metaClass.properties[1]
emp.sayGutenAbend="Guten Nacht"

def metaclass2 = emp.metaClass.properties[1]

assert metaclass1 == metaclass2 // works
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45621682

复制
相关文章

相似问题

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