在Java中动态实现接口

问题描述 投票:0回答:1

我遇到了动态实现接口的问题,并且不知道如何实现这一点。这是我的问题:

我正在为 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反射可以做到这一点吗?如果是的话,怎么办?

感谢任何帮助和建议!

java reflection confluence
1个回答
0
投票

这与“拥有不同的类路径”无关。

重点是

com.atlassian.plugin.webresource.transformer.WebResourceTransformerFactory

com.atlassian.webresource.spi.transformer.WebResourceTransformerFactory

Java 中

有两个不同接口。并且没有“动态”/“基于反射”的方法可以让您解决这个问题。

你必须明白,Java 字节码中的类(或接口)名称始终是绝对的,因此 com.whatever.X 永远不可能与 com.something.else.X “相同”。

换句话说:是的,这是一个破坏性的兼容性更改,并且没有办法“解决”它。

© www.soinside.com 2019 - 2024. All rights reserved.