对象不是它自己的类的“instanceof”

时间:2014-11-17 18:16:28

标签: java spring classloader instanceof

我正在尝试用Spring来解决一些问题,而不是花费一个factoryBean。我已插入调试器并证明失败在AbstraceBeanFactory的这一行:

if(!(beanInstance instanceof FactoryBean) || BeanFactoryUtils.isFactoryDereference(name)) {
   return beanInstance;
}

具体来说,“beanInstance instanceof FactoryBean”部分在应该为true时返回false,导致我返回一个factorybean而不是工厂假设要构造的bean。

我的调试器清楚地告诉我beanInstance是一个org.springframework.beans.factory.config.PropertiesFactoryBean。当我告诉eclipse扩展bean的类时,我看到它清楚地实现了FactoryBean

为了进一步测试,我去了表达式。据说是表达式:

beanInstance instanceof org.springframework.beans.factory.config.PropertiesFactoryBean

返回false。但是beanInstance.getClass()返回

(org.springframework.beans.factory.config.PropertiesFactoryBean) (id=112)

看来我的VM对这门课很困惑。我想弄清楚会导致这种混乱的原因,以及我如何解决它?

最可能的情况似乎是多个类加载器的混淆,但我没有找到任何明显的例子。我的类路径中应该只有一个PropertiesFactoryBean实现。

什么会导致instanceof以这种方式失败?我怎样才能找到根本原因?

顺便说一句,这最终是我正在调试的tomcat实例,如果它是相关的。此外,beanInstance 是一个Objectof的实例,因此intanceof有时可以正常工作。

PS。我不得不手工输入,而是复制/粘贴。请假设任何明显的命名错误都是我的错误。

编辑:修复了评论中提到的paren拼写错误。我想我会这样做。这段代码来自Spring,我没有修改过,因此可以安全地假设代码本身编写得很好并且功能正常,即使我确实输错了

1 个答案:

答案 0 :(得分:0)

如果你有多个webapp(或者同一个webapp的多个版本,以防你使用Tomcat的热门部署功能),每个webapp都有自己的类加载器,还有另一个加载所有东西的类加载器Tomcat的lib文件夹(是其他类加载器的父文件夹)。

因此,如果您正在检查的接口位于您的战争中(或者在您的战争部署的lib中),并且您部署了多个Web应用程序(可能其中一些已经取消部署,但某些对象的引用保持活动状态),请假设它是一个类加载器问题(特别是当您已确认实例上的getClass()Class.forName返回不同的对象时。在两个类对象上调用getClassLoader(Tomcat的类加载器具有良好的toString {1}}方法)并且可能你知道它们来自哪个类加载器/ webapp。

可能短期修复是将包含接口的jar移到war之外并将其放入tomcat的lib文件夹中。

长期解决方法是追踪根本原因并修复它,当然:)