java - 如何验证已编译 Java 代码之间的链接?

标签 java dynamic-linking

一般来说,一组代码(客户端代码)链接到另一组代码(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/

相关文章:

java - 具有固定原点的图形

java - 从继承类引用抽象类中声明的变量

java - Tomcat Web 应用程序需要使用 SSL 客户端身份验证吗?

c++ - 链接器是做什么的?

ios - DYLD_PRINT_STATISTICS 未显示任何内容

c# - 如何构建C#插件框架?

c++ - 没有外部的动态加载 "C"

java - "Could not find the main class: bla.bla.yada",尽管在 MANIFEST.MF 中指定正确

java - 将 JSONObject 转换为字符串并 long 返回 null

c++ - 如何从 Linux 中的 C++ 程序调用 so 文件中存在的类及其函数