【问题标题】:isAssignableFrom function of Class.javaClass.java 的 isAssignableFrom 函数
【发布时间】:2009-11-19 02:13:01
【问题描述】:

我正在尝试关注

上下文 ctx = (上下文) jndiCntx.lookup(fSTANDARD_ENVIRONMENT);

对象 obj = ctx.lookup(fSTANDARD_JNDINAME);

以下代码返回错误

MyClass.class.isAssignableFrom(obj.getClass())

虽然

MyClass.class.getName().equalsIgnoreCase(obj.getClass().getName()) 返回 true。

我无法将 obj 转换为 MyClass,因为它会抛出 ClassCastException。

可能是什么问题?

【问题讨论】:

    标签: java classcastexception


    【解决方案1】:

    我的猜测是这个类已经被两个不同的类加载器加载了。

    在您当前的代码中查看obj.getClass().getClassLoader() 与调用getClassLoader()

    类本身是否可以从两个不同的 jar 文件中获得?这通常很容易解决。如果你有两个单独的类加载器,它们都使用相同的 jar 文件,那就更难了。

    您在哪个容器中运行?我建议您查看类加载器的容器特定文档...例如,这里是 Tomcat 5.5 ClassLoader how-to

    【讨论】:

    • 是的,我得到了 2 个类加载器。但一个是另一个的父母。
    • 好的,听起来子类加载器没有委托给它的父类。您可能需要弄清楚为什么会发生这种情况,并且可以解决它。不过,我怀疑这将针对您的具体情况。
    • context classloader 也有可能会有所帮助 - 我自己从来没有理解过它们 :)
    • 这听起来不错,但据我所知,javadocs class.isAssignableFrom 正在检查类类型——你确定会考虑不同的类加载器吗?
    • @SteveB:是的——从不同的类加载器加载的同一个类名是不同的类。
    【解决方案2】:

    等等,你为什么要调用“equalsIgnoreCase”来检查类名而不是简单的“equals”?您是否可能在(几乎)匹配的名称之间存在冲突?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-16
      • 1970-01-01
      • 2015-07-23
      • 2011-03-24
      • 2021-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多