java / groovy / grails instanceof失败

时间:2016-03-09 16:05:35

标签: java hibernate grails groovy

我有一个名为Video的类和这个类的对象(此处称为“b”)

这是测试用例:

log.debug b
log.debug b.class
log.debug (b.class == Video)
log.debug (b instanceof Video)
log.debug (b.instanceOf(Video))
log.debug (b in Video)

输出是:

DEBUG NavLinkHelperTagLib  - product.content.Video : 4352
DEBUG NavLinkHelperTagLib  - class product.content.Video
DEBUG NavLinkHelperTagLib  - true
DEBUG NavLinkHelperTagLib  - false
DEBUG NavLinkHelperTagLib  - true
DEBUG NavLinkHelperTagLib  - false

有人可以告诉我为什么instanceof失败了吗?!

修改

我觉得这与GORM有关。这是我的捐赠课程:

abstract class Product implements Serializable {

    static hasMany = [additionalContents:AdditionalContent]
}

abstract class AdditionalContent implements Serializable{
    static belongsTo = [product:Product]

}

class Video extends AdditionalContent {
}

我认为这里的问题是延迟加载?但是当这是代理/懒惰问题时,通常我会在调用.getClass()时看到类似Video $$ javaassist的东西,但我没有看到这个......

2 个答案:

答案 0 :(得分:1)

这与Hibernate / Gorm有关。您的域对象很可能由Hibernate代理。因此,您无法使用Java instanceOf

Grails团队意识到了这个问题,因此他们在每个Grails域对象上引入了instanceOf()方法。以下引用来自Grails reference

  

通过使用,您可以在一定程度上保护自己免受此问题的影响   GORM的instanceOf方法:

     

def person = Person.get(1)

     

断言Pet.list()[0] .instanceOf(Dog)

因此,只能使用instanceOf()方法比较域类。

要了解instanceOf的实施方式,您需要使用JD-GUI反编译您的Video域类。

在Grails 3应用程序中,这是由特征GormEntity实现的。

@Traits.TraitBridge(traitClass=GormEntity.class, desc="(Ljava/lang/Class;)Z")
  public boolean instanceOf(Class arg1)
  {
    // Byte code:
    //   0: invokestatic 88 ch/silviowangler/zscsupporter/Game:$getCallSiteArray    ()[Lorg/codehaus/groovy/runtime/callsite/CallSite;
    //   3: astore_2
    //   4: aload_2
    //   5: ldc_w 548
    //   8: aaload
    //   9: ldc -104
    //   11: aload_0
    //   12: aload_1
    //   13: invokeinterface 209 4 0
    //   18: invokestatic 182   org/codehaus/groovy/runtime/typehandling/DefaultTypeTransformation:booleanUnbox (Ljava/lang/Object;)Z
    //   21: ireturn
    //   22: nop
    //   23: nop
    //   24: nop
    //   25: nop
    //   26: nop
    //   27: nop
    //   28: nop
    //   29: nop
    //   30: athrow
    // Local variable table:
    //   start  length  slot    name    signature
    //   0  22  0   this    Game
    //   0  22  1   arg1    Class
  }

这是理解instanceOf方法行为的唯一方法。

答案 1 :(得分:0)

不确定为什么instanceof(我第一次写instanceOf但意味着java关键字)失败,但检查类型的常规方法是in

log.debug b in Video

应该返回true