Java 中多个平台的平台相关代码
Platform dependent code for several platforms in Java
我正在编写应该在 Linux 和 Windows OS 上 运行 的程序。
if (isLinux) {
// some linux code
} else {
// some windows code
}
它使用依赖于平台的代码和库,因此现在无法在 Linux 上编译。如何只编译当前 OS 代码的一部分?
创建接口:
interface OSSpecificStuff {
void method(...)
然后创建接口的两个实现,一个用于 Windows,一个用于 Linux。
class LinuxStuff implements OSSpecificStuff {
void method(...) {
Linux specific implementation
与 class WindowsStuff 等相同。为避免编译错误,将这些 O/S 特定的 classes 编译到单独的 jar 文件中。
使用以下方法创建适当的 class:
Class clazz = isLinux ? Class.forName("LinuxStuff") : Class.forName("WindowsStuff");
OSSpecificStuff stuff= (OSSpecificStuff ) clazz.newInstance();
或者您可以创建两个名为 OSSpecificStuff 的 classes 并将它们放入两个不同的 jar 文件中,并在 运行 程序时将适当的 jar 文件包含在 class 路径中.
进阶内容:
你会发现很多关于 Class.newInstance
不好的 SE 帖子,你可能想用 Constructor
代替。
此外,为了简单起见,我没有在上面的代码中使用泛型。
见Why is Class.newInstance() “evil”?
我正在编写应该在 Linux 和 Windows OS 上 运行 的程序。
if (isLinux) {
// some linux code
} else {
// some windows code
}
它使用依赖于平台的代码和库,因此现在无法在 Linux 上编译。如何只编译当前 OS 代码的一部分?
创建接口:
interface OSSpecificStuff {
void method(...)
然后创建接口的两个实现,一个用于 Windows,一个用于 Linux。
class LinuxStuff implements OSSpecificStuff {
void method(...) {
Linux specific implementation
与 class WindowsStuff 等相同。为避免编译错误,将这些 O/S 特定的 classes 编译到单独的 jar 文件中。
使用以下方法创建适当的 class:
Class clazz = isLinux ? Class.forName("LinuxStuff") : Class.forName("WindowsStuff");
OSSpecificStuff stuff= (OSSpecificStuff ) clazz.newInstance();
或者您可以创建两个名为 OSSpecificStuff 的 classes 并将它们放入两个不同的 jar 文件中,并在 运行 程序时将适当的 jar 文件包含在 class 路径中.
进阶内容:
你会发现很多关于 Class.newInstance
不好的 SE 帖子,你可能想用 Constructor
代替。
此外,为了简单起见,我没有在上面的代码中使用泛型。
见Why is Class.newInstance() “evil”?