Java 怎么实现条件编译?

2020-09-21 15:06:16 +08:00
 enenaaa
java 基础为零。
维护的代码里,有个类引用到了 sun.awt.X11 。
但是又想能跨平台编译,起码在 windows 和 linux 都能用。
怎么屏蔽平台差异呢?
难道只能运行时加载类库么。
3014 次点击
所在节点    Java
16 条回复
czzt1
2020-09-21 15:08:27 +08:00
不需要处理的吧,直接可以跨平台的
wanglulei
2020-09-21 16:22:07 +08:00
jvm 了解一下,java 如何实现跨平台?
wysnylc
2020-09-21 16:23:23 +08:00
去了解下 JVM 跨平台
enenaaa
2020-09-21 16:38:52 +08:00
@czzt1 oracle jdk1.8 的 linux 版本有 sun.awt.X11 包,windows 版本没有。
我现在是想在 linux 用这个包, 在 windows 上用其他方式代替。
在代码里怎么屏蔽差异?
import 可以按条件区分平台么。
InkStone
2020-09-21 16:44:14 +08:00
你可以在构建工具上下功夫。比如 gradle 就支持不同的 flavor 使用不同的源代码……
chendy
2020-09-21 16:44:51 +08:00
不知道这个类是干啥的,但是明显 win 下是木有的,所以
1. 换可以跨平台的实现方式
2. 不同平台不同实现,运行时判断环境使用特定实现
DsuineGP
2020-09-21 16:49:20 +08:00
把不同平台的依赖都打包进去,运行时再根据平台判断加载哪个库
palmers
2020-09-21 17:06:05 +08:00
可以使用 SPI 来做 然后做一个具体平台的 provider 引入
limuyan44
2020-09-21 17:09:03 +08:00
你要不试试 Class.forName("sun.awt.X11")
heian0224
2020-09-21 18:29:58 +08:00
用注解处理器编译器处理
lewis89
2020-09-21 18:41:40 +08:00
javassit 可以在运行时 修改代码 拼接代码
enenaaa
2020-09-21 19:09:38 +08:00
@lewis89
@heian0224
@limuyan44
@palmers
@chendy
@DsuineGP 决定用反射来解决了。
Kaiv2
2020-09-21 19:18:15 +08:00
应该是动态类加载
Citrus
2020-09-21 19:31:47 +08:00
为啥要反射???用的时候做个判断,找不到这个类不要报错直接跳过这段逻辑不就好了?
akiza
2020-09-22 08:51:52 +08:00
@Citrus import 不可以判断这个存不存在吧
heian0224
2020-09-22 17:59:27 +08:00
反射效率不高的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/709049

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX