Groovy 元类与 Java 8 的互操作性

     2023-02-23     76

关键词:

【中文标题】Groovy 元类与 Java 8 的互操作性【英文标题】:Groovy meta class interoperability with Java 8 【发布时间】:2014-05-10 09:12:54 【问题描述】:

简介:

我正在开发一个名为awaitility 的Java 库,它也有一个Groovy 扩展。在 Java 8 之前,您可以像这样使用该库:

// Syntax example with the Groovy extension
await().atMost(500, MILLISECONDS).until  asynch.getValue() == 2 

Groovy 扩展使用在 Java API 中定义的名为 ConditionFactory 的类。但是这个 API 并没有定义一个直到方法,它接受一个 Groovy 闭包的实例。因此,该方法被添加了一个像这样的元类:

ConditionFactory.metaClass.until  Closure closure ->
      delegate.until(new Callable<Boolean>() 
        Boolean call() 
          return closure.call();
        
      );
    

如您所见,它只是委托给 Java API 中的 until 方法,该方法采用 Callable&lt;Boolean&gt; 的实例。

问题:

Java API 还包含until 的重载方法,该方法将Runnable 作为其参数。当 Groovy 扩展与 Java 8 一起使用时,将调用 until 方法的 Runnable 版本,而不是使用 Closure 作为参数的 until 方法(使用 metaClass 定义的方法)。似乎 metaClass 不再起作用了。这是为什么呢?有解决办法吗?

【问题讨论】:

野蛮假设:Closure 不是@FunctionalInterface?它的原型是什么? Closure 不是一个函数式接口,但现在我仔细观察它确实实现了 Runnable!我想这可能是问题所在。 【参考方案1】:

实际上,我认为这与 Java 8 没有任何关系(很抱歉造成混淆)。我的问题的解决方法如下所示:

def originalMethod = ConditionFactory.metaClass.getMetaMethod("until", Runnable.class)
ConditionFactory.metaClass.until  Runnable runnable ->
  if (runnable instanceof Closure) 
    delegate.until(new Callable<Boolean>() 
      Boolean call() 
        return (runnable as Closure).call();
      
    );
   else 
    originalMethod.invoke(delegate, runnable)
  

【讨论】:

Groovy:为接口委托元类?

】Groovy:为接口委托元类?【英文标题】:Groovy:DelegatingmetaclassforanInterface?【发布时间】:2010-10-0707:22:31【问题描述】:使用Groovy的包名称约定,我可以像这样拦截对Java方法的Groovy方法调用:packagegroovy.runtime.metaclass.org.myGang.myPac... 查看详情

如何在 Groovy 类中“隐藏”元类属性

】如何在Groovy类中“隐藏”元类属性【英文标题】:Howto\'hide\'metaClasspropertyinaGroovyclass【发布时间】:2010-10-2323:12:39【问题描述】:我正在创建一些简单的groovy类,例如classPersonintageStringname在依赖反射提取对象属性的Java方法中使... 查看详情

如何使用 Spring boot 将 Groovy 类与 java 类一起运行

】如何使用Springboot将Groovy类与java类一起运行【英文标题】:HowisitPossbiletorunGroovyclasstogetherwithjavaclassesusingSpringboot【发布时间】:2015-06-1718:31:30【问题描述】:我正在尝试将我的spring-boot应用程序(使用gradle和java)与groovy类一起... 查看详情

Grails 和 Groovy 元类包名称约定

】Grails和Groovy元类包名称约定【英文标题】:GrailsandGroovymetaclasspackagenameconvention【发布时间】:2012-07-2910:11:16【问题描述】:我希望能够根据usingthedelegatingmetaclass此处定义的约定将我的元类放在包groovy.runtime.metaclass中。我已将MyC... 查看详情

在 Groovy 中,实例的元类与其类的元类有啥区别

】在Groovy中,实例的元类与其类的元类有啥区别【英文标题】:InGroovywhat\'sthedifferencebetweenaninstance\'smetaClassanditsclass\'smetaClass在Groovy中,实例的元类与其类的元类有什么区别【发布时间】:2016-03-1911:54:35【问题描述】:见以下代... 查看详情

模型元类与模型形式元类有何不同?

】模型元类与模型形式元类有何不同?【英文标题】:HowismodelMetaclassdifferentfrommodelformMetaclass?【发布时间】:2021-12-1502:04:15【问题描述】:我想了解我们在模型中使用的元类。我在文档中找到了它。我记得在模型表单中也添加了... 查看详情

groovy 元类替换超类方法

】groovy元类替换超类方法【英文标题】:groovymetaclassreplacesuperclassmethod【发布时间】:2012-05-1601:11:31【问题描述】:有没有办法使用超类的方法来替换元类对象。示例:classAdefdoIt()two()println\'doit!\'protectedtwo()println\'two\'classBextendsAd... 查看详情

Groovy 元类的范围?

】Groovy元类的范围?【英文标题】:ScopeofGroovy\'smetaClass?【发布时间】:2014-11-1610:41:25【问题描述】:我有一个可以运行脚本来自动执行某些任务的应用程序。我想在这些脚本中使用元编程来优化代码大小和可读性。所以而不是... 查看详情

UnitTest (groovy + grails) - 无法拆卸元类

】UnitTest(groovy+grails)-无法拆卸元类【英文标题】:UnitTest(groovy+grails)-Cannotteardownmetaclass【发布时间】:2013-04-0221:54:46【问题描述】:我在尝试清理班级时遇到问题。voidtestFileExists()FileObjectfile=EasyMock.createMock(FileObject.class)VfsFileSystem... 查看详情

Python 元类与类装饰器

】Python元类与类装饰器【英文标题】:Pythonmetaclassesvsclassdecorators【发布时间】:2010-12-1906:13:25【问题描述】:Python元类和类装饰器之间的主要区别是什么?有什么我可以用一个做而另一个不能做的事情吗?【问题讨论】:【参... 查看详情

Groovy 元类,模拟具有 throws 子句的服务方法

】Groovy元类,模拟具有throws子句的服务方法【英文标题】:Groovymetaclass,mockingaservicemethodthathasthrowsclause【发布时间】:2016-12-1507:57:27【问题描述】:我有一个抽象服务:abstractclassParentServiceabstractMapsomeMethod()throwsNumberFormatException还... 查看详情

将元类与多重继承结合使用的 TypeErrors

】将元类与多重继承结合使用的TypeErrors【英文标题】:TypeErrorsusingmetaclassesinconjunctionwithmultipleinheritance【发布时间】:2011-01-1307:42:18【问题描述】:我有两个关于元类和多重继承的问题。第一个是:为什么我会得到类Derived的TypeE... 查看详情

groovy语法(代码片段)

....4.1.字符串插值4.4.2.插值闭包表达式的特例4.4.3.与Java的互操作性4.4.4.GString和StringhashCodes4.5.三重双引号字符串4.6.Slashystring4.7.美元邋string的字符串4.8.字符串摘要表4.9.人物5.数字5.1.积分文字5.1.1.替代的非基础10表示 二进制文字 八... 查看详情

markdownpythonmetaclass元类与对象的关系,抽象类(代码片段)

查看详情

元类与 Django 中的 modelformset_factory 冲突

】元类与Django中的modelformset_factory冲突【英文标题】:metaclassconflictwithmodelformset_factoryinDjango【发布时间】:2011-12-1814:15:06【问题描述】:我正在使用Django模型继承来创建两个模型-WorkAttachmentPicture和WorkAttachmentAudioclassWorkAttachment(mo... 查看详情

Python 子类跟踪 - 元类与内置

】Python子类跟踪-元类与内置【英文标题】:PythonSubclassTracking-MetaclassesvsBuiltin【发布时间】:2012-03-2617:26:03【问题描述】:对于Django选项卡库,我创建了一个使用标记子类跟踪的架构。为此,我创建了一个基类,然后从中派生所... 查看详情

在引导程序中使用 groovy 元类模拟 Shiro SecurityUtils

】在引导程序中使用groovy元类模拟ShiroSecurityUtils【英文标题】:UsinggroovymetaClasstomockoutShiroSecurityUtilsinbootstrap【发布时间】:2010-12-1500:52:21【问题描述】:更多背景信息,请参阅http://grails.markmail.org/message/62w2xpbgneapmhpd我试图在我... 查看详情

用于预定义类创建的元类与继承

】用于预定义类创建的元类与继承【英文标题】:Metaclassvsinheritanceforpredefinedclasscreation【发布时间】:2019-01-2603:48:58【问题描述】:我正在为一个程序编写一些代码,该程序将能够运行一些软件、读取输入/输出并在此过程中进... 查看详情