Tag: 二进制兼容性

Java中的重构方法和二进制兼容性

在重构方法时,很容易在Java中引入二进制不可编码(使用以前版本的代码)。 考虑更改方法以将其参数的类型扩展为父接口: void doSomething(String x); // change it to void doSomething(CharSequence c); 使用此方法的所有代码将继续编译而不进行更改,但它确实需要重新编译(因为旧的二进制文件将因MethodNotFoundError而失败)。 如何将方法拉入父类。 这需要重新编译吗? // before public class B extends A{ protected void x(){}; } // after public class A { public void x(){}; } public class B extends A{} 该方法已从B移至父A。它还将可见性从受保护更改为公共(但这不是问题)。 我是否需要在B中维护“二进制兼容性包装器”,还是继续工作(自动分派到父类)? // do I need this ? public class B extends A{ // […]

改造void方法以返回其参数以促进流畅性:打破变化?

“API设计就像性:做出一个错误,并在你的余生中支持它” ( Josh Bloch在Twitter上 ) Java库中存在许多设计错误。 Stack extends Vector ( 讨论 ),我们无法在不造成破坏的情况下修复它。 我们可以尝试弃用Integer.getInteger ( 讨论 ),但它可能会永远存在。 尽管如此,某些类型的改装可以在不造成破损的情况下完成。 有效的Java第2版,第18项:首选接口到抽象类 :现有的类可以很容易地进行改进,以实现新的接口“。 示例: String implements CharSequence , Vector implements List等。 有效的Java第2版,第42项:明智地使用varargs :您可以改进现有的方法,该方法将数组作为其最终参数,而不是对现有客户端采取varags。 一个着名的例子是Arrays.asList ,它引起了混淆( 讨论 ),但没有破坏。 这个问题是关于不同类型的改造: 你能改造一个void方法来返回一些东西而不破坏现有的代码吗? 我最初的预感指向是,因为: 返回类型不会影响在编译时选择哪个方法 请参阅: JLS 15.12.2.11 – 不考虑返回类型 因此,更改返回类型不会更改编译器选择的方法 从void改造返回一些东西是合法的(但不是相反的方式!) 即使使用reflection, Class.getMethod东西也不区分返回类型 但是,我希望听到其他在Java / API设计方面经验丰富的人进行更全面的分析。 附录:动机 正如标题中所建议的那样,一个动机是促进流畅的界面风格编程。 考虑这个简单的片段,它打印一个洗牌的名单: List names = […]

Java二进制兼容性问题:sun.font.FontManager类成为接口

我正在使用Lobo – Java Web浏览器库,它给了我一个例外,经过一些研究后我确定可能是因为该库已经与旧版本的Java进行了编译。 代码如下: import java.io.IOException; import org.lobobrowser.html.UserAgentContext; import org.lobobrowser.html.parser.DocumentBuilderImpl; import org.lobobrowser.html.parser.InputSourceImpl; import org.lobobrowser.html.test.SimpleUserAgentContext; import org.xml.sax.SAXException; public class Cobratest { public static void main(String[] args) throws SAXException, IOException { UserAgentContext uAgent = new SimpleUserAgentContext(); DocumentBuilderImpl docBuild = new DocumentBuilderImpl(uAgent); docBuild.parse(new InputSourceImpl(“http://dic.amdz.com/”)); } } 并且堆栈跟踪是: Exception in thread “main” java.lang.IncompatibleClassChangeError: Found interface sun.font.FontManager, but class […]

如何静态地在JAR中识别缺失的方法(二进制兼容性)

我想validation2个JAR之间的二进制兼容性。 根据这个答案中的建议,我使用了jboss tattletale,但它只能找到缺少的类。 如何找到缺少的方法? 有可能吗? 例如 “取决于 – ” Foo 课取决于Bar(像许多其他中产阶级工人一样) import org.overlyusedclassnames.Bar public class Foo{ public void someMethod(){ Bar tender = new Bar(); tender.getJohnnyRedLabel(); tender.getJohnnyBlueLabel(); //this method is new in the Bar class } } “编译时间”课程 package org.overlyusedclassnames; /** * @Since 1992 * Changes: added blue and gold Johnny Walker labels */ public class […]