标签:java syntax java-8 abstract-syntax-tree
我目前正在使用javaparser(https://github.com/javaparser/javaparser)和javasymbolsolver(https://github.com/javaparser/javasymbolsolver)来解析代码.如果我检测到Collections#Streams的使用,来决定特定项目是否已迁移到Java8,那么它是否是一种整体方法.(假设Collection#Streams是使用最广泛的java8特性).
解决方法:
我可以在这里看到多种方法,包括源代码和基于二进制代码,寻找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的分析是否足够 – 像您正在进行的研究可以给出答案.
标签:java,syntax,java-8,abstract-syntax-tree 来源: https://codeday.me/bug/20190608/1198287.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。