`
san_yun
  • 浏览: 2663564 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

报LinkageError的原因

 
阅读更多

LinkageError是一个比较棘手的异常,准确的说它是一个Error而不是Exception。java api对它没有直接的解释,而是介绍了它的子类:

 

    Subclasses of LinkageError indicate that a class has some dependency on another class; however, the latter class has incompatibly changed after the compilation of the former class.

 

似乎是说不兼容性,既编译时,A类用到B类,且这时候A和B是兼容的,但是到运行时,A类得到的B(既某个类加载器加载的B类)却不是A在编译的时候那个与之兼容的B,这个说起来比较复杂,其实就是个二进制兼容性问题,和很多程序不能在98上跑是一个道理,程序就是A,而98就是B。

事实上,真正出现二进制兼容性问题的时候,确实是报NoSuchMethodError或者NoSuchFieldError或者NoClassDefFoundError。Java api对NoSuchMethodError的解释(其他的解释几乎相同):

Thrown if an application tries to call a specified method of a class (either static or instance), and that class no longer has a definition of that method.

Normally, this error is caught by the compiler; this error can only occur at run time if the definition of a class has incompatibly changed.

 

关键词是“incompatibly changed ”。

 

事实证明,当传统意义上的二进制不兼容性(既上面举的98的例子,或者说incompatibly changed)问题发生的时候,java会报NoSuchMethodError,NoSuchFieldError或者NoClassDefFoundError,这三个类都是LinkageError的子类,所以,就好像java api对LinkageError中的解释一样“Subclasses of LinkageError indicate that……”这个解释并没有说LinkageError本身应该是在什么情况下被抛出。倒不是java api顾左右而言他,而是抛出LinkageError的情况实在是很难叙述,《深入java虚拟机》第二版用近乎一章(比较大的一章,和其它章相比)来解释这个问题。归根结底,原因是ClassLoader没有完全按照设计的那样设置:任何一个ClassLoader的实例都应该设置一个恰当的ClassLoader实例为父类加载器,并且在真正defineClass前,都应该先将这个任务委托给其父类加载器。何为恰当的ClassLoader实例?一般来说,就应该是 this.getClass().getClassLoader()(也就是ClassName.class.getClassLoader(),这两个值是同一个值)的返回值),或者是一个设计者认为合理的值。这个值应该保证“相同全限定名的类(可以认为是同一个类,仅仅是可以)不会出现在同一个类的代码中。”举例来说,在一个类的一段代码中(可以是一个方法,或者是一个static块),如果有classLoaderA加载的 test.Test类,也有classLoaderB加载的test.Test,那么,把前者的引用指向后者的实例的时候,就会报LinkageError。

 

分享到:
评论

相关推荐

    LinkageError如何解决.md

    LinkageError如何解决.md

    LinkageError解决办法.md

    LinkageError解决办法.md

    Exception in thread \"main\" java.lang.LinkageError错误的解决

    NULL 博文链接:https://utopialxw.iteye.com/blog/1138133

    LinkageError(解决方案).md

    LinkageError(解决方案).md

    LinkageError.md

    项目中碰到的,记录一下

    Burpsuite永久版

    Burpsuite永久使用版,没有使用限制,V1.7.26版本,http抓包工具。

    Burp suite主题插件.jar

    每个人都知道黑客只在晚上工作,所以多年来人们要求 PortSwigger 实现一个黑暗主题。当他们这样做时,黑客们到处欢欣鼓舞!但是,有些人仍然想要更多......直到...... Burp Customizer! Burp Suite 2020.12 用 ...

    endorsed 解决soa连接错误

    在Java中,如果不同库之间存在版本冲突,可能会导致`java.lang.LinkageError`,特别是涉及到Java API的更新时,如JAXB或JAX-WS。 描述中提到,将解压后的jar包放置在`%TOMCAT_HOME%`和`%JAVA_HOME%\lib\endorsed`...

    Tomcat常见错误

    - 错误描述:类加载器问题,如“java.lang.LinkageError”。 - 原因分析:应用内部或库之间存在不同的JAR版本,导致类加载冲突。 - 解决方案:统一JAR版本,避免冲突,或调整类加载策略。 10. **XML配置错误** ...

    juel-Tomcat与EL冲突问题

    启动Tomcat时报错:Caused by: java.lang.LinkageError: loader constraints violated when linking javax/el/ExpressionFactory class 说明:原因是juel.jar, juel-engine.jar, juel-impl.jar包和Tomcat6.0中的el-...

    juel-impl.jar

    javax.servlet.ServletException: java.lang.LinkageError

    JavaSE程序设计课件:L05-Exceptions and Assertions - 1.pdf

    * LinkageError:链接错误,例如,类文件损坏或不存在。 * Error:错误,例如,内存溢出或堆栈溢出。 * AWTError:AWT 相关的错误,例如,无法创建 GUI 组件。 * AWTException:AWT 相关的异常,例如,无法加载图像...

    JBoss JMX实现架构

    在JBoss这样的应用服务器中,理解这些异常及其原因至关重要,因为它们可以帮助诊断和解决动态部署过程中可能出现的问题。通过优化类加载器的策略和管理,可以提高系统的稳定性和可扩展性。 总之,JBoss JMX的实现...

    CXF-JAXB包的处理问题

    本文将深入探讨如何解决CXF与JAXB版本冲突,以及如何处理Java.lang.LinkageError,特别是当JAXB 2.1 API与2.2 API之间发生不兼容时的情况。 首先,LinkageError通常发生在类加载过程中,当试图访问的类在不同的类...

Global site tag (gtag.js) - Google Analytics