假设您有接口定义。
那个界面可以是Operation。
然后,您有两个应用程序在不同的 JVM 中运行,并通过交换Operation实例以某种方式进行远程通信。
让我们称它们为 application A和 application B。
如果应用程序A使用应用程序B的类路径中不可用的类来实现Operation ,应用程序B仍然能够处理该接口的实现吗?即使B在不同的JVM中?
这取决于您的“以某种方式远程通信”部分中发生的魔法。
如果这种通信是通过 RMI 或类似技术完成的,那么就可以了。应用程序 B 将为Operation
JVM A 中的对象创建一个远程代理,并在此代理上调用方法生成对 JVM A 的 HTTP 请求,这些请求针对存在于该 JVM 中的实际对象(可以访问实现类)进行解析。
如果这种通信是通过序列化对象并通过网络发送它们来完成的,那么它将不起作用。当来自应用程序 A 的对象到达 JVM B 时,反序列化将失败(使用 aClassNotFoundException
或类似的方法)。
很可能还有其他远程技术,在这种情况下,事情取决于实现。我知道类加载器可以从字节数组加载类,因此从概念上讲,拥有能够从远程源加载类的类加载器是很有可能的。我相信,网络库理论上可以通过这种方式通过线路序列化实际类,因此虽然 JVM B 本身不会知道实现类,但它的类加载器将根据需要提供类的字节码。
这取决于“以某种方式远程通信”的含义。如果应用程序 A实际上只是将某种内置于代理中的令牌交给应用程序 B,以便对 Operation 接口的调用被代理回应用程序 A,那么它可能没问题。如果想法是让应用程序 B 创建实现类的本地实例,那么这是行不通的,因为它不知道对象的样子。
只要它只尝试通过公共接口引用它,它应该能够处理它。只要它们都实现相同版本的接口,实际实现并不重要。