我用一个虚拟的Employee groovy类编写了以下测试。
@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");
}上面的测试通过了,下面的测试失败了-
@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")
}与前面的代码示例唯一的区别是,为元类上的相同属性设置了一个新值。只是好奇而已。有人能告诉我为什么会这样吗?
发布于 2017-08-11 05:05:20
使用元编程创建字段后,不需要使用metaClass对其进行重置
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,因此,此操作失败:
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在此过程中:
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 // workshttps://stackoverflow.com/questions/45621682
复制相似问题