从ins.getClass()获取Item _ $$ _ javassist_165.getSimpleName()

Abd*_*UMI 1 grails grails-orm

我有三个实现复合模式的类,Item,Cluster和Element.

class Item extends Locatable {
  ...
}

class Cluster extends Item {

    static hasMany = [items:Item]

  ...
}

class Element extends Item {
  ...
}
Run Code Online (Sandbox Code Playgroud)

我的域模型比这更复杂,但它只是一个例子.当我有一个Item实例时,我想知道它是一个簇还是一个元素,ins.getClass().getSimpleName()我得到一个奇怪的类名:Item_$$_javassist_165如果我这样做,println ins.toString()我会打印出正确的类名(toString方法返回this.getClass().getSimpleName()).

如何获得正确的班级名称?这个"Item_$$_javassist_165"班级名字是什么?

Ian*_*rts 5

这个"Item_$$_javassist_165"班级名字是什么?

这意味着你拥有的对象是一个Hibernate延迟加载代理.第一次尝试访问除该对象的id之外的任何内容时,Hibernate将转到数据库并加载实际数据,然后将任何将来的方法调用委托给真实对象.

ins instanceof Cluster当您有一个扩展另一个域类的域类时,明显的方法可能无法在代理存在的情况下正常工作,但GORM提供了一个注入的instanceOf方法,它可以执行您需要的操作并正确处理代理.

if(ins.instanceOf(Cluster)) { .... }
Run Code Online (Sandbox Code Playgroud)