Spoon系列-概要

  • 概要
  • 相关资源
  • 主要功能
    • 可构建 AST(Abstract Syntax Tree)
    • 静态代码分析(Static Code Analysis)
  • 代码重写转换(Transform)

概要

可对Java 源代码进行分析,重写,转换的开源工具。支持Java13。

相关资源

Source&Document

Example

学术文档

主要功能

可构建 AST(Abstract Syntax Tree)

例如对Helloworld.java

package spoon_explore_test;public class HelloWorld {public void helloWorld() {System.out.println("Hello World!");}public static void main(String[] args) {new HelloWorld().helloWorld();try {} catch (Throwable e) {}}}

当执行完如下命令后:

java -cp spoon -core -{{site.spoon_release}}-jar -with -dependencies.jar spoon.Launcher \
-i helloword.java --gui

可生成如下的AST:

静态代码分析(Static Code Analysis)

  1. 可通过Processor对代码进行静态扫描

    • 可检出代码缺陷等
  2. 和JUnit联合使用,强制遵循命名规范等架构规范。

例如:下面的Processor将会对代码进行静态扫描,查找出空的try{}catch{}代码块的代码:

package spoon_explore;import org.apache.logging.log4j.Level;import spoon.processing.AbstractProcessor;
import spoon.reflect.code.CtCatch;/*** Reports warnings when empty catch blocks are found.*/
public class CatchProcessor extends AbstractProcessor<CtCatch> {public void process(CtCatch element) {// we get all statements and if there isn't statement , it means the block catch is empty!if (element.getBody().getStatements().size() == 0) {System.out.println("empty catch clause:" + element);getFactory().getEnvironment().report(this, Level.WARN, element, "empty catch clause");}}
}

同样对于Helloworld.java

package spoon_explore_test;public class HelloWorld {public void helloWorld() {System.out.println("Hello World!");}public static void main(String[] args) {new HelloWorld().helloWorld();try {} catch (Throwable e) {}}}

执行:

$ java -classpath /path/to/processor.jar:spoon -core -{{site.spoon_release}}-jar -with -
dependencies.jar \
spoon.Launcher -i /path/to/src/of/your/project -p processors.CatchProcessor

返回如下结果:

empty catch clause:catch (java.lang.Throwable e) {
}

例如:下面的代码当public方法的Javadoc不完整的时候,Junit测试会无法通过。

package spoon_explore;import static org.junit.Assert.fail;import java.util.ArrayList;
import java.util.List;import org.apache.commons.lang3.StringUtils;
import org.junit.Test;import spoon.Launcher;
import spoon.SpoonAPI;
import spoon.reflect.declaration.CtMethod;
import spoon.reflect.declaration.CtType;
import spoon.reflect.declaration.ModifierKind;
import spoon.reflect.visitor.filter.TypeFilter;public class JavaDocTest {@Testpublic void testDocumentation() throws Exception {SpoonAPI spoon = new Launcher();spoon.addInputResource("src/main/java/");spoon.buildModel();List<String> notDocumented = new ArrayList<>();for (CtMethod method : spoon.getModel().getElements(new TypeFilter<>(CtMethod.class))) {// now we see whether this should be documentedif (method.hasModifier(ModifierKind.PUBLIC) && method.getTopDefinitions().size() == 0) // optional: only the// top{// is it really well documented?if (method.getDocComment().length() < 20) { // at least 20 charactersnotDocumented.add(method.getParent(CtType.class).getQualifiedName() + "#" + method.getSignature());}}}if (notDocumented.size() > 0){fail(notDocumented.size() + " public methods should be documented with proper API    documentation: \n"+ StringUtils.join(notDocumented, "\n"));}}
}

代码重写转换(Transform)

可通过Spoon提供的API来改写AST树,重写或者转换元代码。

例如:利用如下的Processor可在代码之前添加System.out.println打印函数的入口信息:

package spoon_explore;import spoon.Launcher;
import spoon.processing.AbstractProcessor;
import spoon.reflect.code.CtCodeSnippetStatement;
import spoon.reflect.declaration.CtClass;
import spoon.reflect.declaration.CtExecutable;/*** Example of tracing** class A{ void m(Object o} { ...(method body) .... } }** is transformed into** void m(Object o} { System.out.println("enter in method m from class A"); //* rest of the method body } Use with $ java -jar spoon.jar -i src/main/java -o* spooned -p fr.inria.gforge.spoon.transformation.autologging.LogProcessor** Of with https://github.com/SpoonLabs/spoon-maven-plugin* */
public class LogProcessor extends AbstractProcessor<CtExecutable> {@Overridepublic void process(CtExecutable element) {CtCodeSnippetStatement snippet = getFactory().Core().createCodeSnippetStatement();// Snippet which contains the log.final String value = String.format("System.out.println(\"Enter in the method %s from class %s\");",element.getSimpleName(), element.getParent(CtClass.class).getSimpleName());snippet.setValue(value);// Inserts the snippet at the beginning of the method body.if (element.getBody() != null) {element.getBody().insertBegin(snippet);}}public static void main(String[] args) {Launcher spoon = new Launcher();spoon.addInputResource("C:/d/workspace_learn/spoon_learn/spoon_explore_test/src/main/java/");spoon.addProcessor(new LogProcessor());spoon.run();spoon.prettyprint();}
}

对于Helloworld.java被重写的代码如下:

package spoon_explore_test;
public class HelloWorld {public void helloWorld() {System.out.println("Enter in the method helloWorld from class HelloWorld");;java.lang.System.out.println("Hello World!");}public static void main(java.lang.String[] args) {System.out.println("Enter in the method main from class HelloWorld");;new spoon_explore_test.HelloWorld().helloWorld();try {} catch (java.lang.Throwable e) {}}
}

Spoon系列-概要相关推荐

  1. 3.1 计算机视觉的发展和卷积神经网络概要(百度架构师手把手带你零基础实践深度学习原版笔记系列)

    3.1 计算机视觉的发展和卷积神经网络(百度架构师手把手带你零基础实践深度学习原版笔记系列) 概要 计算机视觉作为一门让机器学会如何去"看"的科学学科,具体的说,就是让机器去识别摄 ...

  2. disco晶圆切割机8020系列(双轴)

    disco双轴晶圆切割机8020系列概要: 8020系列切割机有两个对向的主轴,可同时切割晶圆,且产量高.这种高精度系统可切割直径最高8"的工件,性能高. disco双轴晶圆切割机8020系 ...

  3. SUNLORDINC顺络电子提供车载绕线贴片功率电感—AMWPB系列

    SUNLORDINC顺络电子提供车载绕线贴片功率电感-AMWPB系列 车载绕线贴片功率电感-AMWPB系列 概要 功率电感AMWPB系列是顺络利用积累至今的制造工艺经验及材料技术,结合BASE卡线激光 ...

  4. 【C#|.NET】从控制反转(依赖注入)想到事件注入 (非AOP)

    前文 事件注入的想法是由依赖注入所联想到 依赖注入不算什么吸引人的话题 本篇就不详说了 不过有闲暇时间的机会不妨按照自己的兴趣去摸索.研究一些东西,也是一种乐子. 在抓虫系列里简单的描述一下依赖注入在 ...

  5. iOS 架构模式--解密 MVC,MVP,MVVM以及VIPER架构

    2019独角兽企业重金招聘Python工程师标准>>> 本文由CocoaChina译者lynulzy(社区ID)翻译 作者:Bohdan Orlov 原文:iOS Architect ...

  6. ultrascale和arm区别_ZYNQ UltraScale+ MPSoc FPGA初学笔记

    前言 最近要做新的设计用到Xilinx ZYNQ UltraScale+ MPSoc系列的芯片.文档看到吐,阅读间隙和妹子聊天,还被吐槽太闲.人生不易,我决定把近几日所学,整理成一篇文章,让大家少走点 ...

  7. 聊聊“元宇宙” —— 设备篇

    概要引言 这将会使一系列的文章,主要谈及有关"元宇宙"一些话题.本篇则作为整个系列概要,后期将持续更新本文. "元宇宙"是骗人的吗? 元宇宙有两种基本粒子:傻子 ...

  8. python连接sap接口_python中调用api接口

    CDN之API以及SDK的调用 简介 阿里云CDN提供了丰富的API接口,除了控制台,CDN还开发了多样化的接口.目前我们推荐用户使用新版API,详情请参见新版API参考.同时CDN提供了多语言SDK ...

  9. Linux Kernel系列一:开篇和Kernel启动概要

    前言 近期几个月将Linux Kernel的大概研究了一下,以下须要进行深入具体的分析.主要将以S3C2440的一块开发板为硬件实体.大概包含例如以下内容: 1 bootloader分析,以uboot ...

最新文章

  1. html将字符转成浮点数,stm32用串口接收到数据,怎么把接收到的字符串转换成浮点数?...
  2. 【嵌入式干货】hex、bin转换、以及hex合成工具(基于Python)
  3. 线程的状态转换、sleep()、wait()、yeild()、终止线程的方法、线程之间的协作(join()、wait() notify() notifyAll()、await() signal() )
  4. reportviewer控件mysql_reportviewer控件下载
  5. 续——《RedHat/Fedora等非ubuntu的Linux系统星空极速netkeeper拨号上网 》
  6. 蓝桥杯第八届省赛JAVA真题----最大公共子串
  7. 职高计算机word教学视频,职高计算机专业Word范例教学三例.doc
  8. python 单向链表
  9. Android camera开发(9)---Dual Camera(MTK solution)开案说明
  10. 世界你好! 个人网站搭建过程
  11. JS 打印 iframe
  12. 棋牌游戏开发的风险有哪些?
  13. 数据分析2021年最实用工具排名前6位出炉
  14. C++输出小于N的所有素数
  15. 使用AFNetWorking请求错误
  16. 计算机设计大赛指导老师的申报书,附件大赛作品申报书.DOC
  17. dhtml_DHTML乌托邦:使用JavaScript和DOM的现代Web设计
  18. Kafka架构篇 - 多副本机制
  19. Oracle查询CLOB类型字段的内容:
  20. NeurIPS 2022 | ​NAS-Bench-Graph: 图神经网络架构搜索Benchmark

热门文章

  1. Lightswitch Desktopclinet 中如何调用WEB API
  2. 大数据系统开发综合实践(一)
  3. 关于xftp和xshell 软件评估期已过的解决办法
  4. 手机cpu什么型号支持鸿蒙系统,华为鸿蒙2.0系统支持的手机型号(图文)
  5. tokenpocket内网页获取用户钱包信息
  6. 【vue大师晋级之路第一集:Vue基础】第8章——事件处理
  7. 进入U盘PE系统无法识别硬盘分区的原因分析和解决方法
  8. 【科创人南京行】西祠胡同创始人“响马”刘琥:一生寻找精神绿林,减区块链也许是正确方向...
  9. char、int、long它们各占几个字节?占几位?
  10. 【图解】什么是拥塞控制,这应该是把拥塞控制讲的最好的文章了