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

Java 反射-getInterfaces()显示奇怪的接口,java,hibernate,reflection,Java,Hibernate,Reflection,使用Hibernate,我得到一个列表(BlablaPO实现Blabla)。 当我这样做的时候: for(Blabla blabla : list) { Class<?>[] interfazes = blabla.getClass().getInterfaces(); } for(Blabla-bla:list){ 类[]interfazes=blabla.getClass().getInterfaces(); } 此代码只是接受集合的一段代码的一部分。今天,我在一个新

使用
Hibernate
,我得到一个
列表
BlablaPO
实现
Blabla
)。 当我这样做的时候:

for(Blabla blabla : list) {
    Class<?>[] interfazes = blabla.getClass().getInterfaces();
}
for(Blabla-bla:list){
类[]interfazes=blabla.getClass().getInterfaces();
}
此代码只是接受
集合的一段代码的一部分。今天,我在一个新的
列表中再次使用了这段代码,我返回的接口中没有Blabla,而是有两个接口:

  • 接口
    org.hibernate.proxy.HibernateProxy
  • 接口
    javassist.util.proxy.ProxyObject
我是不是装错了?我迫不及待地试着把收藏品装进去

编辑:
我确信问题是因为我懒散地加载了我的集合。

发生这种情况是因为Hibernate将您的实例替换为代理您自己的类的生成类。例如,一个类似bean的:

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

当您询问
Foo$Hibernate
的接口时,您将无法看到
SomeInterface
,您必须首先导航到
SomeInterface
。但是,SomeInterface的条件
foo instanceOf
将继续保持,并且可能是您想要的条件。

我的问题是,我延迟加载了所有内容。解决方案是正确加载所有内容,从而使代码100%完美地工作:)。

那么,如何解决这个问题呢?超类的接口不也应该显示吗?您必须沿着类层次结构进行迭代。您可以检查一个类来实现HibernateProxy,在这种情况下,您可以检查接口的超类,而不是检查类本身。这是正确的,但在以后的阶段,我的对象的所有值都将是空的,因为我延迟加载了它。不,Hibernate功能仍然可用,您无法避免使用反射进行虚拟分派。你只需要访问类型图进行分析。我的意思是,我陷入这种情况是因为我懒散地加载了所有内容。我一修好,一切都很好:)。谢谢你的洞察力
blabla.getClass()
是问题所在,(
blablabla
不是
newblapo()
),请尝试
org.hibernate.proxy.hibernateProxy助手#getClassWithoutInitializingProxy(blabl‌​a) .getInterfaces()
。这不是问题所在。在这种情况下,若blapo实现了Blabla,那个么Blabla就是blapo。问题是我延迟加载了所有内容。在本例中,blabla是一个blapo,但不完全是一个新的blapo()。延迟加载并不是错误加载。这是默认行为,有时比急切加载更可取。我知道这并不坏。事实上,我总是尝试以最小的负载加载所有的东西。在本例中,我需要整个对象,而不仅仅是id。
class Foo$Hibernate extends Foo implements HibernateProxy, ProxyObject {
  @Override
  public String getBar() { Hibernate.loadFromDBOnDemand(); }
}