- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想动态地将字段和方法添加到当前对象的 metaClass
中。我试过了
this.metaClass.testProp = "test"
添加一个名为testProp
的字段。但是,我得到了
groovy.lang.MissingPropertyException: No such property: testProp for class: groovy.lang.MetaClassImpl
当我在类里面做同样的事情时,例如将 testProp 添加到类而不是直接添加到对象
Process.metaClass.testProp = "test"
它有效,但我的对象没有继承该字段。任何正确方向的想法或指示将不胜感激。
最佳答案
简短回答:
Process.metaClass.testProp = "test"
this.metaClass = null
assert this.testProp == "test"
长答案:
我认为,有 3 件事给你带来了问题。第一个是元类有一个全局注册表。第二个是 Groovy 允许每个实例元类(这是 Groovy 类的默认设置)。第三个是默认元类不允许运行时元编程。
因此,如果您进行运行时元编程,则默认值需要替换为 ExpandoMetaClass (EMC),以实现这一点。但由于存在每个实例元类逻辑,因此此替换可能不会影响所有实例。实例的元类在第一次使用时从全局注册表中获取。 Process.metaClass.testProp = "test"
更改全局保存的。任何已经具有元类的实例都不会知道更改,因此也不知道该属性。 this.metaClass.testProp = "test"
只会改变当前实例的元类,其他实例可能不知道。您可以使用 this.metaclass = null
来重置它。并且它将再次从全局注册表请求元类。如果您对每个实例进行了更改,则您的更改将消失。如果您进行了全局更改,则您的更改现在可见。
如果您使用 Groovy 中的默认元类 (MetaClassImpl),那么所有这些都很重要。如果您在代码中进行类似 a 的更改,则新的元类将是 ExpandoMetaClass (EMC)。该元类允许更改,因此进一步的更改不会导致元类的替换。为了确保所有实例从一开始就采用 ExpandoMetaClass,您通常具有如下所示的某种设置代码:ExpandoMetaClass.enableGlobally()
所以为了解决你的问题,我可以简单地这样做
Process.metaClass.testProp = "test"
this.metaClass = null
assert this.testProp == "test"
如果您之前在某些设置代码中使用过ExpandoMetaClass.enableGlobally()
,则可以将元类的重置代码保留在外(或者如果全局元类与“这个”以及如果是 EMC)。例如,Grails 默认使用 EMC
关于Groovy - 将属性或方法动态添加到此元类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32411927/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!