groovy - "Use"在 groovy 中如何工作?

标签 groovy

您好,我有以下代码片段;

class StringCalci
{
        static def plus(Integer self, Integer Operand)
        {
                return self.toInteger() * Operand.toInteger()
        }
}
use (StringCalci)
{
        println("inside the Use method!")
        println( 12 + 3 )
}
println(12+3)

看到groovy中Use的使用,我惊呆了。问题是我可以在运行时向类添加方法(我自己的方法)。当我查看上面的代码时,我在想 Groovy 如何使事情成为可能! Useprintln 的使用是将两个给定的数字相乘(因为我有 Override the plus 方法),而外部 println 添加它!我的问题是 Groovy 如何识别 Use 中执行的 printlnUse 之外的 printlnUse 是关键字/方法吗?我需要了解这个过程的幕后情况。请告诉我:) 提前致谢:)

最佳答案

欢迎来到动态语言的美妙世界,这里一切皆有可能,一切皆有可能!

此功能称为 Categories .至于实现:

  • use 实际上不是关键字而是 Groovy 运行时的方法 adds to the Object class ,这使得它随处可用。
  • 我认为功能主要在类 GroovyCategorySupport 中实现
  • 从 Javadoc 来看,它是基于在 ThreadLocal 中保留覆盖方法的映射,然后在每次方法调用时查询该映射。
  • 是的,这对性能来说不是很好,但是 Groovy 和类似语言提供的几乎所有动态“神奇”特性(而且有很多)也是如此。

关于groovy - "Use"在 groovy 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5443339/

相关文章:

grails - Controller 循环中的Grails错误处理

sql - 如何从 grails 调用数据库函数?

regex - (也)匹配空字符串的正向前瞻

grails - 无法在MVC结构中找到类文件-初学者

grails - 在 Groovy 中使用 "$"

oop - 从抽象类继承属性,并对抽象属性进行排序

java - 如何从liberty-server build.gradle文件中排除传递依赖项

gradle - 在 gradle 的插件扩展中传递闭包

grails - geb.error.PageInstanceNotInitializedException

java - Selenium 如何多次等待具有不同文本的同一个 WebElement