使用Intellij IDEA或Android Studio查看OpenJDK的Java源码

  • A+
所属分类:Java

无论是对Java开发,还是对Android开发来说,Java这门语言都十分重要。虽然网上各路技术人士(甚至包括正在使用Java的人)都喜欢对Java进行各种各样的、惨无人道的嘲讽(如语法啰嗦、滥用设计模式等),但无法改变的一个事实就是Java依然是现在、甚至将来很长一段时间的,最重要的一门编程语言之一。

在你意识到Java语言对你很重要之后,我想你一定会迫不及待地想要提升自己对Java的理解。提升自己的能力有很多途径,而看JDK的Java源码,无疑是一种非常好的办法。

今天,就简单的介绍一下,如何使用IntelliJ IDEA或Android Studio(反正它就是个加壳IDEA)查看Java源码。

下载OpenJDK的Java源码

没啥好说的,想要看源码,首先你得下载下来。虽然很多人的电脑上安装的是OracleJDK(SunJDK),但OracleJDK不提供源码,提供的都是二进制包,所以我们最好的选择当然是开源的OpenJDK了。也许有人会觉得这2个JDK的差别非常大,有一句说一句,根据R大(RednaxelaFX)的说法

从Oracle JDK7 / OpenJDK7开始,闭源和开源版的实质差异实在是非常非常小。与其说OpenJDK7是“不完整的JDK”,还不如说Oracle JDK7在OpenJDK7的基础上带了一些value-add,其中很多还没啥用(例如browser plugin)。

好的,选择OpenJDK完全是OK的。那么,选择哪个版本呢?

老旧的Java5、Java6以及更远古的版本就不说了,能跟上潮流的其实就是Java8了(无论你是Java开发还是Android开发,实际上很多公司的生产环境至今都没能升级到Java8),而且Java8是LTS版,是被长期支持的。2018年下半年发布的Java11同样是LTS版,在包含了Java9和Java10两个大版本的许多特性后,还添加了一些新东西(不过语法层面改进不多),十分推荐。总而言之呢,Java8足够,Java11更加面向未来。大版本确定了,小版本的选择完全不用纠结,根据Oracle官网的说法,一般奇数版是安全性的update,偶数版则是功能性的update。但这是对开发者、尤其是生产环境来说的,对于一个研究源码的人来说,哪个小版本都行。比如,我目前在看的是OpenJDK_11.0.1版本。

在https://jdk.java.net/这里就能下载到OpenJDK的源码了。

下载了源码后,解压,然后来到解压后的lib目录下,找到一个名为src的压缩包,再将其解压,即得到了src目录,该目录下就是我们想要的Java源码了:

Java source list

使用IDE(IntelliJ IDEA/Android Studio)查看Java源码

这一步简直太容易了。第一步,打开你的IDE。第二步,就像打开一个工程一样,File->Open,选择src目录,然后就得到了你想要的结果。至于为什么不使用Eclipse呢?只能说JetBrains家的产品实在是太优秀了,在项目管理、开发效率、智能提示登诸多方面都非常出色,如果你想去大公司或者技术型小公司,那么IDEA是你必备的技能。当然,不能否认Eclipse的经典,但时代总是在进步,不是么?而对于Android开发者来说,Android Studio已经是必选项了。

view Java source in Android Studio or IntelliJ IDEA

刚打开,可能会提示你依赖方面有错误。这个时候,需要我们打开File->Project Structure,然后在Modules的Dependencies选项卡里面,设置Module SDK为你刚才解压的JDK路径。这样设置后,一般是可以看源码的,但一些跳转还是不太舒服,会跳转到src.zip压缩包里,而不是你解压后的src目录,会对感观体验稍有影响。可以在Project Structure的SDKs选项里,把11(因为我这里是Java11)的Sourcepath添加整个src目录,然后把原来的src.zip(有很长的一大串,排在上面)全部删掉就可以了。

change sourcepath

最终,我们可以实现查看Java源码,且进行类之间的跳转时,依然跳转到src目录下的、已经解压好的类中,非常的舒服。

也许会遇到的问题

在打开String类的时候,遇到了这样的提示:

generics are not supported at this language level / generics are not supported at language level 1.3

意思是语言版本是1.3,泛型在该版本里不支持(泛型是Java1.5才有的)。我的第一感受是:什么?我刚才设置的SDK版本不是11吗?你怎么给我认成了1.3版本?解决办法依然是设置Project Structure,在Project下有个Project language level,我也不知道为什么它默认给设置成了1.3……改成其他更高版本就好。

generics are not supported at this language level / generics are not supported at language level 1.3

KaelLi

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: