反射 - getInterfaces()显示奇怪的接口

时间:2016-06-01 11:38:45

标签: java hibernate reflection

使用Hibernate,我得到List<BlablaPO>BlablaPO实现Blabla)。 当我做这样的事情时:

for(Blabla blabla : list) {
    Class<?>[] interfazes = blabla.getClass().getInterfaces();
}

此代码只是接受Collection<T>的一段代码的一部分。今天,我在新的List<Blabla>上再次使用了这个代码,我的返回接口没有Blabla,而是我得到2个接口:

  • interface org.hibernate.proxy.HibernateProxy
  • interface javassist.util.proxy.ProxyObject

我错误地加载了这个系列吗?我试着热切地加载这个系列。

编辑: 我很确定这个问题是因为我懒惰地加载了我的收藏。

2 个答案:

答案 0 :(得分:1)

这是因为Hibernate用代理您自己的类的生成类替换您的实例。例如,像:

这样的bean
class Foo implements SomeInterface {
   @OneToMany
   public List<MyBean> getBar() { ... }
}

将由Hibernate子类化,类似于以下类:

class Foo$Hibernate extends Foo implements HibernateProxy, ProxyObject {
  @Override
  public String getBar() { Hibernate.loadFromDBOnDemand(); }
}

当您要求Foo$Hibernate的界面时,您将无法看到SomeInterface,您必须先导航至SomeInterface。然而,条件foo instanceOf SomeInterface将继续存在,并且可能是您想要的目标。

答案 1 :(得分:0)

我的问题是我懒洋洋地装了一切。解决方案是正确加载所有内容,这导致代码100%完美地工作:)。