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(blabla) .getInterfaces()
。这不是问题所在。在这种情况下,若blapo实现了Blabla,那个么Blabla就是blapo。问题是我延迟加载了所有内容。在本例中,blabla是一个blapo,但不完全是一个新的blapo()。延迟加载并不是错误加载。这是默认行为,有时比急切加载更可取。我知道这并不坏。事实上,我总是尝试以最小的负载加载所有的东西。在本例中,我需要整个对象,而不仅仅是id。
class Foo$Hibernate extends Foo implements HibernateProxy, ProxyObject {
@Override
public String getBar() { Hibernate.loadFromDBOnDemand(); }
}