Object o = bar.method();
System.err.println("The object " + o + " classloader is " + o.getClass().getClassLoader());
System.err.println("Class Foo class loader is " + Foo.class.getClassLoader());
Foo f = (Foo) o;
典型的输出可能与此类似:
The object Foo@@3e86d0 classloader is
sun.misc.Launcher$AppClassLoader@b9d04
Class Foo classloader is weblogic.utils.classloaders.ChangeAwareClassLoader@5998cb finder: weblogic.utils.classloaders.MultiClassFinder@7c2528
下一步是探查为什么涉及了不同的 ClassLoader。请执行下列检查清单中的各项检查:
检查应用程序打包情况,并检查“Foo”是否是使用由不同 ClassLoader 加载的不同模块打包而成。在这方面众所周知的一个成因是 Web 应用程序的“prefer-web-inf-classes”功能(请参阅已知的 WebLogic 问题)
摘要:发出连接请求时,WebLogic Server 会返回一个代理对象,该对象通过资源适配器将连接对象封装后返回到客户端。WebLogic Server 使用该代理来提供一些功能,帮助应用程序使用 WebLogic Server 的“J2EE 连接器体系结构”实现。这些功能包括 (1) 连接泄漏检测功能和 (2) 连接请求在启动使用该连接的全局事务之前发出时,推迟 XAResource 登记。
摘要:weblogic.xml Web 应用程序部署描述符包含一个 prefer-web-inf-classes 元素(container-descriptor 元素的子元素)。缺省情况下,此元素设置为 False。如果将此元素设置为 True,则不遵循 ClassLoader 委托模型,从而使 Web 应用程序中的类定义的加载顺序优先于更高级别的 ClassLoader 中的类定义。这样 Web 应用程序就可使用其自己版本的第三方类,该类也可能是 WebLogic Server 的一部分。请参阅 weblogic.xml Deployment Descriptor Elements (English)。
使用该功能时,必须注意不要混淆使用 Web 应用程序的类定义创建的实例与使用服务器的定义创建的实例。如果混淆了此类实例,就会发生 ClassCastException。