有没有办法检查该类或对象在Groovy中有mixin?

时间:2013-07-27 06:39:56

标签: groovy mixins

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 presense的通用方法,例如如果我有两个看起来完全相同的mixin,但只是以不同方式实现的东西怎么办?

1 个答案:

答案 0 :(得分:1)

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

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

基于此,听起来vehicle.respondsTo('fly')就像你将要获得的那样接近。