我遇到了动态实现接口的问题,并且不知道如何实现这一点。这是我的问题:
我正在为 Confluence 开发一个插件应用程序,我有一个类
Transformer
实现了 WebResourceTransformerFactory
类型,该类型来自 Atlassian Confluence 公共库,类路径为 com.atlassian.plugin.webresource.transformer.*
。
我想让我的插件应用程序兼容一定范围的Confluence版本(8 -> 9),但是随着Confluence最新版本的更改,接口类型
WebResourceTransformerFactory
已移至新包com.atlassian.webresource.spi.transformer.WebResourceTransformerFactory
这导致我的插件应用程序与新版本的 Confluence 不兼容。
Transformer.java
兼容旧版本(Confluence v8)
import com.atlassian.plugin.webresource.transformer.*;
public class Transformer implements WebResourceTransformerFactory {
// Do something...
}
Transformer.java
兼容新版本(Confluence v9)
import com.atlassian.webresource.spi.transformer.WebResourceTransformerFactory;
public class Transformer implements WebResourceTransformerFactory {
// Do something...
}
如您所见,
WebResourceTransformerFactory
具有不同的类路径和不同的运行时环境(Confluence)。我想知道如何让我的类Transformer.java
在不同版本的Confluence上运行时使用不同的类路径动态实现WebResourceTransformerFactory
。 Java反射可以做到这一点吗?如果是的话,怎么办?
感谢任何帮助和建议!
这与“拥有不同的类路径”无关。
重点是
com.atlassian.plugin.webresource.transformer.WebResourceTransformerFactory
和
com.atlassian.webresource.spi.transformer.WebResourceTransformerFactory
Java 中有两个不同接口。并且没有“动态”/“基于反射”的方法可以让您解决这个问题。
你必须明白,Java 字节码中的类(或接口)名称始终是绝对的,因此 com.whatever.X 永远不可能与 com.something.else.X “相同”。
换句话说:是的,这是一个破坏性的兼容性更改,并且没有办法“解决”它。