我有一个名为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的东西,但我没有看到这个......
答案 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