Spoon系列-概要

article/2025/10/30 14:56:29

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:
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) {}}
}

http://chatgpt.dhexx.cn/article/tQsnVLMu.shtml

相关文章

Spoon图形操作

Spoon图形操作 一、 Kettle的导入导出1.1 csv、txt(02、03)1.2 xlsx(Excel)(04)1.3 XML(05)1.4 json(06)1.5 SQL1.5.1 MySQL基础语法1.5.2 Spoon中的数据库操作(08) 1.6 CDC操作(Change Data Capture)(09、10)1.6.1 基于时间戳的CDC1.6.2 基于自增序列的CDC数据导入1.6.3 基于触…

kettle Spoon 的简单使用

Spoon分享 Kettle Spoon简介 ETL&#xff08;Extract-Transform-Load的缩写&#xff0c;即数据抽取、转换、装载的过程&#xff09;&#xff0c;对于企业或行业应用来说&#xff0c;我们经常会遇到各种数据的处理&#xff0c;转换&#xff0c;迁移&#xff0c;了解并掌握一种e…

基于kettle部署图形化界面(spoon)

最近使用kettle部署windows&#xff0c;mac、linux服务遇到的坑做一个总结。 1、mac、linux部署&#xff1a; 1⃣️拉取docker镜像 docker pull hiromuhota/webspoon 2⃣️创建并运行docker容器 docker run -d -p 8080:8080 hiromuhota/webspoon --name webspoon --restar…

数据导入与预处理——1.初步熟悉kettle-Spoon

文章目录 数据文件1.导入2.导出3.分发与复制 提示&#xff1a;以下是本篇文章正文内容&#xff0c;为初步使用spoon软件进行数据的导入导出步骤。 数据文件 1.导入 数据文件的导入 首先建立csv文件格式如下&#xff1a; 打开kettle新建转换&#xff1a; 从输入中找到对应的…

kettle运行spoon.sh启动图形化界面报错处理

一、问题描述&#xff1a; 安装kettle成功后运行spoon.sh显示如下报错&#xff1a; 二、原因分析&#xff1a; 没有安装Xmanager 三、解决方案&#xff1a; 1.下载Xmanager软件&#xff0c;安装教程参考 Xmanager 6标准版详细安装教程_小祥V5的博客-CSDN博客_xmanager安装教程…

问题:Spoon.bat启动不起来

问题&#xff1a;使用kettle进行数据迁移时&#xff0c;Spoon.bat死活启动不起来&#xff0c;尝试各种办法。 运行环境&#xff1a;windows7 64位&#xff0c;jdk1.8及以上&#xff0c;且环境变量配置ok。 检验&#xff1a;cmd->java -version&#xff0c;可以查看。环境变…

Macox kettle安装启动报错:一个未预期的错误发生在Spoon: probable cause:在停止Spoon前,请先关闭其它spoon窗口!

Macox kettle安装启动报错&#xff1a;一个未预期的错误发生在Spoon: probable cause:在停止Spoon前&#xff0c;请先关闭其它spoon窗口! 最近需要从oracle导一批数据到mysql&#xff0c;需要用到kettle&#xff0c;于是下载了mac版的kettle工具&#xff0c;基本步骤如下&…

Kettle spoon 工具实战分享

今天给大家带来一款ETL工具kettle spoon的实践分享 Kettle是一款国外开源的ETL工具&#xff0c;纯java编写&#xff0c;可以在Window、Linux、Unix上运行&#xff0c;数据抽取高效稳定。 Kettle这个ETL工具集&#xff0c;它允许你管理来自不同数据库的数据&#xff0c;通过提…

Springboot+Kettle(Spoon)

Springboot集成kettle实战 介绍项目截图javakettle实战代码1 pom.xml2 kettleUtil3 业务层方法a 资源库业务b 转换的相关业务c 完整代码 介绍 kettle就不介绍了,Web界面极其简单、丑陋&#xff0c;生产环境无法投入使用.所以这篇实战内容是springboot结合kettle的web端执行已经…

spoon新手入门教程

Kettle是一款国外开源的ETL工具&#xff0c;纯java编写&#xff0c;可以在Window、Linux、Unix上运行&#xff0c;数据抽取高效稳定。Kettle 中文名称叫水壶&#xff0c;该项目的主程序员MATT 希望把各种数据放到一个壶里&#xff0c;然后以一种指定的格式流出。Kettle这个ETL工…

集线器、交换机与路由器有什么区别?

转发自&#xff1a;https://mp.weixin.qq.com/s/YXWBw3aFTSEFvkg_oN9eQA 我相信我们都玩过一款特别火的游戏&#xff1a;帝国时代。小时候想要玩帝国时代&#xff0c;需要到软件城购买盗版光盘安装&#xff08;大概3块钱一张左右的样子&#xff0c;当时已经觉得很便宜了&#…

集线器和中继器

首先要明白&#xff0c;集线器和中继器两者都属于物理层的设备。物理层设备和其他层次的设备(如&#xff1a;交换机、网桥、路由器)最大的区别在于&#xff1a;集线器和中继器工作在同一个网段下的&#xff0c;而交换机、路由器等设备是工作在不同网段下的。 网段&#xff1a;…

# 网络中的一些基本概念 网卡、集线器、网桥(自学用)

# 网络中的一些基本概念 网卡、集线器、网桥 1. 网卡 1. 有几个网卡就有几个MAC地址 2. 计算机上的网卡来接收数据&#xff0c;网卡将数据传递给上一层 3. 发送数据&#xff1a;需要知道IP地址&#xff0c;但最终是根据MAC地址&#xff08;网卡地址&#xff09;&#xff0c;输送…

【计算机网络-数据链路层】集线器、网桥、交换机

本文许多文字和图片使用了湖科大教书匠&#xff08;高军老师&#xff09;的 PPT&#xff0c;在此表示感谢。正是他让非科班的我能以奇妙的方式走进网络的世界。 文章目录 1 【物理层】集线器&#xff08;Hub&#xff09;——共享式以太网1.1 为什么使用集线器&#xff1f;1.2 …

【计网】(一) 集线器、网桥、交换机、路由器等概念

这篇文章将介绍计算机网络中的一些基础概念&#xff0c;以及生活中我们所常见的一些设备&#xff08;交换机、路由器等&#xff09;的作用。 目录 ✅ 互联网的概念✅ 什么是网络协议✅ 网络互联模型✅ 计算机之间是如何通信的&#x1f43e; 网线直连&#x1f43e; 同轴电缆(Co…

扩展以太网——集线器

一、集线器 1、集线器组建的以太网其实是一个冲突域&#xff0c;因为其共享信道&#xff0c;会存在信号冲突。 2、集线器是物理层设备&#xff0c;信号经过它的时候直接传输&#xff0c;没有存储再转发的过程。 3、集线器和网线一样工作在物理层。 二、集线器的优缺点 1、…

集线器、交换机与路由器有什么区别和联系?

转载&#xff1a;集线器、交换机与路由器有什么区别&#xff1f; 我相信我们都玩过一款特别火的游戏&#xff1a;帝国时代。小时候想要玩帝国时代&#xff0c;需要到软件城购买盗版光盘安装&#xff08;大概3块钱一张左右的样子&#xff0c;当时已经觉得很便宜了&#xff0c;谁…

中继器、集线器、网桥、交换机、路由器

全家福 两台主机如何连接起来&#xff1f; 在网络诞生之前&#xff0c;电脑之间都是单机运行&#xff0c;没有网卡、没有网线、没有协议栈&#xff0c;数据传输主要通过软盘、光盘等介质。 网线来了 【网线网卡协议栈】三要素&#xff0c;是组成“最小单元网络”的基础&#x…

集线器、交换机、路由器有什么区别?

作者&#xff1a;薛定谔不在家 来源&#xff1a;https://www.zhihu.com/question/22007235/answer/402261894 帝国时代 我相信我们都玩过一款特别火的游戏&#xff1a;帝国时代。小时候想要玩帝国时代&#xff0c;需要到软件城购买盗版光盘安装&#xff0c;大概3块钱一张左右的…

集线器、交换机和路由器之间有何不同?

集线器、交换机和路由器都是用于构建网络的设备&#xff0c;且分别在不同层次发挥着其作用 。但目前&#xff0c;许多人对集线器、交换机和路由器的认识并不充分&#xff0c;甚至不知道这三者之间有什么区别。下面将重点为您介绍集线器、交换机和路由器&#xff0c;并阐明它们之…