【问题标题】:pre-compiler switches in java: how to change the path for an imported classjava中的预编译器开关:如何更改导入类的路径
【发布时间】:2011-11-18 13:27:06
【问题描述】:

我需要在两个不同的平台 SDK 上使用相同的类。

虽然类及其方法相同,但访问该类的路径不同。 在我需要使用的一台设备上:

导入 a1.a2.classname

而对于我需要使用的第二个设备:

导入 b1.b2.b3.classname

请不要问我为什么:SDK 不是我写的,也无法更改。

所以问题是:你会怎么做?有没有办法在不同的sdk版本上导入同一个类的不同版本?

在 C++ 中,我会使用如下预编译器开关:

#ifdef SDK1
#include "path1/class.h"
#else
#include "path2/class.h"
#endif

你会如何在 java 中做到这一点?

请考虑我不能从类派生,因为我只能访问它的接口,而且方法的数量太大而无法考虑使用代理

【问题讨论】:

  • 这会让你编写多个构建。如果您使用Class.forName(),您可以为两者使用一个构建并在运行时选择差异。 (应用程序可以根据使用情况检测要导入哪一个)
  • 问题在于,在我使用该类的所有类中,我必须为不同的 SDK 添加不同的导入。这是真的,除非我将类包装在我想避免的代理中
  • 我倾向于避免多次构建,因为一旦你开始走这条路,这可能会变成一场噩梦。

标签: java macros import precompiler


【解决方案1】:

您可以编写一个轻量级代理层并检查Class.forName() 可用的类。如果您的两个班级将来在签名等方面存在分歧,这是要走的路。

但是,如果您完全确定它们将始终保留相同的功能,那么只需在您的构建工具中搜索并替换所有相关导入实例即可。在 maven 中你可以使用资源过滤,this question 有一个例子。

【讨论】:

  • 对,但我试图避免编写代理,因为该类有很多方法:这很无聊......
  • @user38 我意识到了,因此是第二段。那么不是一个可接受的解决方案吗?
  • 最后我写了一些代理。我认为使用 Maven 也是合理的。为了不厌烦编写代理,我使用正则表达式自动将 eclipse 生成的存根转换为调用“真实主题”实例的实现 :-)
猜你喜欢
  • 2020-04-15
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 2023-01-05
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
相关资源
最近更新 更多