问题标签 [inria-spoon]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
56 浏览

java - 如何在 Spring Boot 应用程序中访问文件夹

目录结构图片

我想从java主函数访问反编译文件夹下的CFRDecompiler文件夹,我该怎么做

0 投票
0 回答
23 浏览

inria-spoon - 防止spoon访问JVM类路径

有什么办法,我可以阻止勺子解析器访问 JVM 类路径并在 launcher.setSouceClassPath() 中提供必要的 jars(rt.jar 等)?

0 投票
1 回答
188 浏览

java - 用勺子修改java方法体

我正在尝试重构旧的 SimpleFormController。我想用实际的成功视图和表单视图字符串替换 getSuccessView() 和 gerFormView() 调用。

我浏览了https://spoon.gforge.inria.fr/first_transformation.html,它显示了如何生成和添加语句,但是我不明白如何修改。

我已经尝试了几件事。

用 getSuccessView() 和 getFormView() 调用替换语句

然而,这会在块末尾添加不需要的 if() {... }; 当 if {} else {} 块包含 return 语句时,这会产生语法错误。当有多个具有相同名称的类(例如,Map 存在于少数库的类路径中)时,自动导入打开并且不添加导入 - 这与文档一致。重构代码时可以避免这种情况吗?原始 java 文件具有正确的导入。

我尝试的另一种方法是直接操纵整个身体。

这仍然与第一个具有相同的自动导入问题。除此之外,它还添加了多余的花括号,例如

会变成

那当然会打印得很漂亮。

getOriginalSourceFragment() 的 javadocs 也有以下警告

警告:这是一种高级方法,不能被视为稳定 API 的一部分

我想做的另一件事是为 getSuccessView() 的每种使用类型创建模式,例如 viewName = getSuccessView(); 返回 getSuccessView(); 返回 ModelAndView(getSuccessView(), map); 等等,但是为此我将不得不编写一大堆处理器/模板。

由于它是简单的替换,最简单的方法是执行以下操作

由于我可以避免在spoon的帮助下进行文本操作,例如更改修饰符、注释、方法名称、注释等,我希望应该有更好的方法来修改方法主体。

0 投票
1 回答
52 浏览

inria-spoon - API 函数 `replace` 不会用 CtClass 实例替换类

我正在尝试执行以下代码。

在哪里

originalElement

并且uniqueParent

但是,当我尝试用 替换originalElementuniqueParent,它不起作用。我已经尝试使用其他元素替换 API,例如CtMethod它在那里工作。我想知道这是预期的行为CtClass还是应该是错误?

0 投票
1 回答
53 浏览

inria-spoon - 在没有严格编译的情况下为 CtCodeSnippetStatement 构建 Spoon CtElements

有没有办法在不完全编译的情况下为 CtCodeSnippetStatement 构建 CtElement?我有一些片段我希望能够扫描和进一步处理,然后再将它们插入到具有其余依赖项(片段可能引用的方法/全局变量)的类中。

0 投票
2 回答
313 浏览

soot - wala 和 soot 和有什么不一样?

我需要为 Java 中的以下任务选择一个框架:

  • 提取控制流图
  • 过程间和过程内分析
  • 数据流分析
  • PDG
  • 不同的源代码分析任务(如方法体提取、测试代码提取)

哪个框架适合我的任务?

我遇到了很多不同的工具,除了 wala、soot 以及 JavaParser、Spoon 等等。

我应该选择哪个框架?理想情况下,我想采用一种更易于使用的工具。此外,我的期望是,Java 工具的普及应该已经存在于所有这些任务中。还是我的理解有误?

如果有人请指点我不同的资源等,我将不胜感激。

0 投票
1 回答
83 浏览

java - 以编程方式将java代码添加到现有java文件的任何可能方法?

我有一个使用我创建的自定义 Maven 插件自动生成的接口和类文件。该插件将从 JSON 文件中读取必要的数据,并使用 Jenesis4Java(下面提供 Mojo 代码)为我创建一个 Java 文件。

要求- 我必须遍历已生成的文件并在该文件中添加新方法或代码。有什么方法可以从 Mojo 实现这一目标吗?看看下面生成的代码,所以我必须向它添加一个新的抽象方法。

我只能从头开始重新生成同一个文件,但不能添加到现有代码中。

生成了以下代码-

在 mojo 文件中,我编写了生成这个和另一个类文件的逻辑。(mojo指maven插件创建过程中的java文件)

Mojo 文件供参考-

0 投票
1 回答
21 浏览

java - 勺子英里亚。不根据环境(Docker 和本地 Spring Boot)解析 CtExecutableReference 类型和声明类型

再会。

我在我的 Java 项目中使用 Spoon 分析库时遇到了非常奇怪的问题。运行相同的代码时,我得到不同的解析结果,在不同的环境中使用 Spoon Launcher

  • 1 环境 - 从 Intellij IDEA 在本地运行的 Spring Boot 项目
  • 2 环境 - 在 Docker 容器中运行的相同 Spring Boot 项目

在本地运行的 Spring Boot 项目中 - 一切正常,但是当我在 Docker 中运行相同的代码时 - 我null CtExecutableReference.getType()CtExecutableReference.getDeclaredType()

我在 GitHub 上打开了问题 - https://github.com/INRIA/spoon/issues/3926

这是详细信息

我的 Spoon 版本是 8.2.0。(来自Maven回购)

我正在尝试从这个 GitHub 存储库解析(构建 AST)代码 并且我在解析这个类时遇到了麻烦 这里有以下几行

当我运行分析并尝试解析语句方法时,我会CtExecutableReferencefindAll()Docker中运行我的项目时获取值。在本地运行并且 具有非空值时this.valuesRepository.findAll().forEach(values::add)nullgetType()getDeclaredType()getType()getDeclaredType()

解析其他项目中的其他类似代码块时会发生同样的问题。例如这里

this.betRepository.findAll()带有null 的语句在 Docker 中运行时都为空,但在本地环境中正常getTypegetDeclaredType

同时以下代码在两种环境中都能很好地解析

并且语句betRepository.findByCustomerId()解析正常,并且在 Docker 和 n 本地 Spring Boot 运行中都有必要的类型信息。

我仔细检查了本地测试 - 一切正常 - 当从 IDE 运行测试中的代码或从 IDE 启动 Spring Boot 项目并通过从 Web UI 调用服务来初始化分析时 - 它正常并且按预期工作。

但是当我构建 Docker 映像时 - 我的类型和声明类型都为空。

我正在使用以下代码运行 Spoon 分析

在运行 Launcher 之前,我尝试打印它的设置。这是我得到的

我在 Java8 上运行项目 - 在两种环境中(详情如下)。要构建 docker,我使用以下命令

我尝试切换到不同的 Docker 基础映像(openjdk \ alpine 等),但没有任何帮助。我试图排除上面列出的所有 java 运行选项(例如 -XXblabla)——也没有帮助。

为了了解可能出现的问题,我在应用程序启动时打印所有环境(包括 java)数据。

这里是为本地环境打印的

这是在Docker环境中打印的内容

任何帮助,将不胜感激

0 投票
0 回答
13 浏览

inria-spoon - 如何从编译单元获取所有导入语句?

我正在使用以下代码片段来识别编译单元中的所有导入语句

但是这个系列中缺少某些进口产品。这是正确的方法吗?我可以看到这被 ImportAnalzyer 类所取代,但不知道如何使用它。另外我正在使用以下代码来提取导入包名和类名。这是正确的方法吗?

任何帮助都感激不尽

0 投票
0 回答
5 浏览

inria-spoon - 如何为狙击模式打印实现 OutputType 过滤器

根据 JDTBasedSpoonCompiler 的代码片段,编译单元不考虑输出类型过滤器。

对于狙击模式打印,输出类型在内部配置为编译单元。我正在使用带有 Maven Launcher 的 Maven 项目,并且只对将修改后的编译单元输出到输出文件夹感兴趣。目前,所有输入文件也都填充在输出文件夹中,这是不正确的。

有什么方法可以实现过滤器?