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

时间:2013-08-21 12:30:20

标签: grails gorm

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

class Item extends Locatable {
  ...
}

class Cluster extends Item {

    static hasMany = [items:Item]

  ...
}

class Element extends Item {
  ...
}

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

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

3 个答案:

答案 0 :(得分:5)

  

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

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

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

if(ins.instanceOf(Cluster)) { .... }

答案 1 :(得分:2)

您可以使用GrailsHibernateUtil.unwrapIfProxy(object)从代理对象接收原始对象实例。解包后,您应该能够使用getClass().getSimpleName()获取真正的班级名称。请注意,您松开了未打开对象上的延迟加载等功能。

答案 2 :(得分:0)

我找到了一个给出真实姓名的方法:

org.hibernate.Hibernate.getClass(ins).getSimpleName()