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