作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想弄明白为什么我的两个 Java 库很难很好地协同工作。这是场景:
库 1 有一个类 A,其构造函数如下:
public A(Object obj) { /* boilerplate */ }
在以前的版本中,A 的构造函数是:
public A(Serializable s) { /* more or less same boilerplate */ }
现在库 2 是针对以前的版本构建的,并构造了 A 的一个实例:
A myObject = new A( (Serializable) arg);
当库 1(最新版本)和库 2 一起部署时,构造函数调用会抛出 NoSuchMethodError,堆栈跟踪说明 JVM 正在寻找具有可序列化参数的构造函数。
在我看来,所有对象实例都可以转换为 Object,即使在调用期间显式转换为接口(interface)也是如此。然而,这个实验证明并非如此。对于后代,谁能详细说明导致 NoSuchMethodError 出现的 Java 规则是什么?如果能引用规范,我将不胜感激。
最佳答案
new A(...)
调用的方法在编译库 2 时解析,其签名存储在库 2 的类文件中。
如果针对旧版本的库 1 编译库 2,则 A myObject = new A( (Serializable) arg)
的字节码将类似于:
9: new #1; //class A
12: aload_1 //arg
13: invokespecial #24; //Method "<init>":(Ljava/io/Serializable;)V
如果在调用此代码时具有此签名的方法不再存在,您将收到 NoSuchMethodError
。
关于java - 导致 NoSuchMethodError 的显式转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8081749/
我是一名优秀的程序员,十分优秀!