【问题标题】:Is there a way to check that class or object has a mixin in Groovy?有没有办法检查 Groovy 中的类或对象是否有 mixin?
【发布时间】:2013-07-27 12:43:50
【问题描述】:

Groovy 的用户指南上有一个例子:

@Category(Vehicle) class FlyingAbility {
    def fly() { "I'm the ${name} and I fly!" }
}

@Category(Vehicle) class DivingAbility {
    def dive() { "I'm the ${name} and I dive!" }
}

interface Vehicle {
    String getName()
}

@Mixin(DivingAbility)
class Submarine implements Vehicle {
    String getName() { "Yellow Submarine" }
}

@Mixin(FlyingAbility)
class Plane implements Vehicle {
    String getName() { "Concorde" }
}

@Mixin([DivingAbility, FlyingAbility])
class JamesBondVehicle implements Vehicle {
    String getName() { "James Bond's vehicle" }
}

如果我有JamesBondVehicle 的实例:

def vehicle = new JamesBondVechile()

如何检查vehicle 是否有飞行能力?特别是在我不知道车辆是如何创建的情况下。

以下不起作用:

assert vehicle instanceof FlyingAbility

以下作品:

assert vehicle.respondsTo('fly')

但这不是检查 mixin 存在的通用方法,例如如果我有 2 个看起来完全一样的 mixin,但实现的东西不同呢?

【问题讨论】:

    标签: groovy mixins


    【解决方案1】:

    我认为这是不可能的。我不是 Groovy 方面的专家,但我稍微挖掘了一下,在代码库中找到了这个函数:MixinInMetaClass.mixinClassesToMetaClass

    如果您查看那里的代码,它似乎并没有做任何事情来实际保留混入的类的名称。相反,它只是遍历它们的所有属性并将它们合并到目标类中(如果有)不是冲突。

    基于此,听起来vehicle.respondsTo('fly') 与您将获得的一样接近。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-27
      • 2014-11-14
      • 2011-05-16
      • 1970-01-01
      • 2015-04-19
      • 2010-11-20
      • 1970-01-01
      相关资源
      最近更新 更多