我可以在这里看到多种方法,包括源代码和基于二进制代码,寻找Java 8 API并寻找Java 8语言特性.
寻找Java 8 API
在源代码中寻找常见的Java 8 API(简单)
您可以解析代码并查找最初出现在Java 8中的API – 正如您在答案中所建议的那样. Java 8 API最常见的功能是streams和Optional类,以及java.util.function包.我希望几乎所有迁移到Java 8的项目都能使用这些功能.
在源代码中查找所有Java 8 API(高级)
要获得100%的答案,如果某个特定项目是否使用Java 8 API,您需要查找的不是某些项目,而是查找Java 8中添加的所有API.可能有很多方法可以找到该列表,但是有一个名为Sigtest的工具专门用于比较产品的不同版本的API(在这种情况下,产品是Java本身).
在二进制文件中也一样
可能更便宜的方法是使用二进制文件而不是源文件.所有外部链接都放在.class文件的开头,在一个名为常量池的部分中.有些工具可以帮助您提取此数据,例如ClassDep(它作为Apache River的一部分分发,但您可以单独使用它).
检查语言版本
检查二进制文件中的类文件版本
对于每种语言版本,都会在类文件中记录不同的版本.对于Java 7,它是51.0,对于Java 8 – 52.0,对于Java 9 – 53.0.当使用-v选项启动时,JDK附带的javap工具会打印此版本.
寻找Java 8语言功能
由于您正在使用源代码,我假设您的解析器支持Java 8.如果是这样,它将能够识别Java 8语言结构,如lambda和方法引用. Java 8语言功能的完整(好吧,我认为它是完整的)列表是here.
关于结果的准确性
每种方法的准确性取决于问题所在.如果是“项目是否使用Java 8?”那么没有一种方法会给出100%的结果.正如Holger在他的评论中指出的那样,可能存在部分迁移的项目,这些项目仅针对Java 8进行编译,并且不使用任何API,或者仅使用Java 8 API但是针对Java 7编译.
问题“项目是否使用语言级别为8的编译?”最好通过类文件版本分析来回答 – 任何使用lambdas的类都将具有版本52.0,但反之亦然.
问题“项目是否使用Java 8 API?”,显然需要分析引用.我只能推测对所选API的分析是否足够 – 像您正在进行的研究可以给出答案.