动态向groovy中的对象添加属性或方法

2023-12-23

是否可以在 Groovy 中动态向对象添加属性或方法?这是我到目前为止所尝试过的:

class Greet {
  def name
  Greet(who) { name = who[0].toUpperCase() + [1..-1] }
  def salute() { println "Hello $name!" }
}

g = new Greet('world')  // create object
g.salute()              // Output "Hello World!"

g.bye = { println "Goodbye, $name" }
g.bye()

但我得到以下异常:

Hello World!
Caught: groovy.lang.MissingPropertyException: No such property: bye for class: Greet
Possible solutions: name
    at test.run(greet.groovy:11)

如果您只想添加bye()方法到单个实例g班级的Greet,你需要做:

g.metaClass.bye = { println "Goodbye, $name" }
g.bye()

否则,要添加bye()到所有实例Greet(从现在开始),请致电

Greet.metaClass.bye = { println "Goodbye, $name" }

但是您需要在创建实例之前执行此操作Greet class

这是关于每个实例元类的页面 http://groovy-lang.org/metaprogramming.html#_per_instance_metaclass

这是一般元类的页面 http://groovy-lang.org/metaprogramming.html#_metaclasses


另外,您的构造函数中存在错误。你失踪了who从你面前[1..-1]如果构造函数传递了一个String长度小于2个字符,会抛出异常

更好的版本可能是:

Greet( String who ) { 
  name = who.inject( '' ) { String s, String c ->
    s += s ? c.toLowerCase() : c.toUpperCase()
  }
}

正如评论中提到的,

Greet( String who ) { 
  name = who.capitalize()
}

是正确的方法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态向groovy中的对象添加属性或方法 的相关文章

随机推荐

  • 有鼻子测试的 GUI 吗?

    过去几个月我一直在使用nosetests 来运行我的Python 单元测试 它确实可以完成工作 但对于直观地显示哪些测试正在运行或正在破坏的情况来说 它并不是很好 我使用了其他几个基于 GUI 的单元测试框架 它们提供单元测试状态的可视化快
  • Three.js 中的旋转方向或用手习惯

    我注意到当我绕 Z 轴旋转模型时 如下所示 model rotateZ rotatedAngle Math PI 180 它似乎绕轴逆时针旋转 这个观察准确吗 这有记录在某处吗 我找不到它 也许我使用了错误的搜索词 这是可配置的吗 最重要的
  • Python 中的矩阵向​​量运算

    我发过一个类似的帖子here https stackoverflow com questions 53384285 initialize the first index of a list in python 现在我试图概括整个数字矩阵所做
  • 将 Vue.js v-on 事件添加到 D3 SVG 元素

    是否可以将 VueJS v on 事件添加到 D3 中的 SVG 元素 我想对 SVG 的每个矩形元素使用 v on mouseover 功能 我试图通过添加来做到这一点v on mouseover active active 作为 D3
  • SqlConnection和SqlDataReader的重用

    如果我想在不同的表上运行多个 SELECT 查询 我可以对所有表使用相同的 SqlDataReader 和 SqlConnection 吗 以下是明智的吗 我输入得很快 所以它缺少 try catch MySqlCommand myComm
  • 使用多个子图更改 y 轴(线性、对数、sqrt)的设置按钮,Plotly

    我想设置一个按钮 在线性 对数和开方之间更改 3 个子图的 Y 轴 来自 vestland 对我之前问题的回答 从下拉菜单或按钮中将 sqrt 设置为 y 轴刻度 Python Plotly https stackoverflow com
  • 仅使用一个 .xib 文件进行纵向和横向的替代 iOS 布局

    使用 xcode 中的界面生成器和一个 xib 文件 如何在横向和纵向之间旋转时创建替代布局 See diagram of differing layouts N b 绿色视图 区域将包含 3 个横向流动的项目 而纵向流动的这 3 个项目将
  • 使用 Jersey 将 JSON 反序列化为对象

    我正在使用 Jersey 它从客户端的 JSON 或 xml 创建一个对象 现在 我正在使用 JSONp 创建一个对象 由于 jsonp 无法发送数据 所以我只能使用 get 发送数据 我可以使用 GET 请求并仍然反序列化吗 我知道我可以
  • Xcode 9.0.1 Interface Builder 100% CPU 打开 iOS Storyboard

    昨晚 Xcode 自动更新到版本 9 0 1 9A1004 今天 我尝试打开一个现有项目 但我的 iOS 故事板文件陷入了永不停歇的旋转器中 并且活动监视器报告 Interface Builder 使用 100 CPU 我有第二台 MacB
  • 进口和依赖

    我读过两篇最近讨论依赖和导入的帖子 2 14 0 即将到来的命名空间 依赖 导入更改 请一些定义 使用 https stackoverflow com questions 7880355 upcoming namespace depends
  • Python从内存中运行exe[重复]

    这个问题在这里已经有答案了 exe requests get url content run exe subprocess run exe shell True stdout subprocess PIPE stderr subproces
  • 将当前更改放入新的 Git 分支中 [重复]

    这个问题在这里已经有答案了 我一直在主分支上编辑一些模块 但尚未提交它们 我现在认为这些更改实际上应该发生在实验分支上 而不是主分支上 如何将这些编辑放入实验分支中 将它们复制到某个临时位置 创建分支 然后将它们复制回来 我该如何配置 以便
  • Angular JS 路由不起作用

    index html 看起来像
  • 为 Linux 创建可移植的 Python(本地安装)

    我正在寻找创建以下内容 一个可移植版本的 python 可以在任何系统上运行 安装任何以前版本的 python 或未安装 python 并预先配置了各种 python 包 即 django lxml pysqlite 等 我发现最接近上面的
  • 无法解析来自根提供程序的范围服务。 ASP.NET MVC 应用程序

    我正在使用 Adam Freeman 的 Pro ASP NET Core MVC 6th Edition 制作商店应用程序 书中的例子是用Core 1 0做的 我用的是Core 3 0 在尝试将数据播种到我的数据库 entityFrame
  • github:没有可用的受支持的身份验证方法

    我使用 github 并在过去在我的笔记本电脑上成功添加和同步了文件 最近我开始得到 PuTTY 致命错误 已断开连接 没有可用的支持的身份验证方法 运行后 git pull origin master 或push however ssh
  • 如何阻止html模板转义

    我有一个 html 模板 我想在其中插入一些模板本身外部的 JavaScript 代码 在我的模板数据结构中 我创建了一个字符串字段JS string并调用它 JS 问题是浏览器中的所有内容都被转义了 换行符是 n lt and gt ar
  • 真正的 MVVM 和第三方控件

    在 True MVVM 模型中 我们不期望 xaml cs 中隐藏任何代码 也不期望 viewModel 具有视图引用 然而 所有第三方控件都不能为 True MVVM 提供良好的支持 就我而言 我使用 Infragistics xamDa
  • C/C++ 中的可变参数函数和参数赋值

    我想知道在 C C 语言中是否可以以键值形式将参数传递给函数 例如在 python 中你可以这样做 def some function arg0 default value arg1 value1 passed value some fun
  • 动态向groovy中的对象添加属性或方法

    是否可以在 Groovy 中动态向对象添加属性或方法 这是我到目前为止所尝试过的 class Greet def name Greet who name who 0 toUpperCase 1 1 def salute println He