一般来说,一组代码(客户端代码)链接到另一组代码(API 代码)。 Java 链接通常在编译时在 .java 和 .class 之间验证,或者在运行时在 .class 和 .class 之间验证。然而,在后一种情况下,验证是在遇到错误引用时进行的(即它是惰性的)。
有没有办法用编译后的代码同时强制验证客户端代码和 API 代码之间的所有链接?目的是验证客户端代码是否适用于给定版本的 API - 即使它是针对另一个版本编译的。
(当然有一种方法是对API进行反编译再编译,但是有没有更直接的方法呢?)
最佳答案
由于语言的性质和 JVM 的实现,强制验证链接很困难。
我相信这个问题的基本原理是为了防止运行时出现链接错误,这样做的意图是非常有效的。但是,如果从JVM的角度来看链接错误的原因,那么在不影响性能的情况下强制执行验证或多或少是困难的。
当 JVM 执行对应于 method invocation instructions 的字节码时,在运行时抛出链接错误。 .通常在这一点上,延迟的 final pass of the JVM's bytecode verifier被踢入,这可能导致链接错误。不用说,从性能的角度来看,这是昂贵的。
(我的假设是)大多数项目(包括商业项目)因此避免强制验证,而是依赖构建和依赖管理系统来避免痛苦。更多评论在this SO question ;选择 OSGi 框架的答案可能会有所帮助。
关于java - 如何验证已编译 Java 代码之间的链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3356237/