问题标签 [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.
java - 如何在 Spring Boot 应用程序中访问文件夹
我想从java主函数访问反编译文件夹下的CFRDecompiler文件夹,我该怎么做
inria-spoon - 防止spoon访问JVM类路径
有什么办法,我可以阻止勺子解析器访问 JVM 类路径并在 launcher.setSouceClassPath() 中提供必要的 jars(rt.jar 等)?
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的帮助下进行文本操作,例如更改修饰符、注释、方法名称、注释等,我希望应该有更好的方法来修改方法主体。
inria-spoon - API 函数 `replace` 不会用 CtClass 实例替换类
我正在尝试执行以下代码。
在哪里
originalElement
是
并且uniqueParent
是
但是,当我尝试用 替换originalElement
时uniqueParent
,它不起作用。我已经尝试使用其他元素替换 API,例如CtMethod
它在那里工作。我想知道这是预期的行为CtClass
还是应该是错误?
inria-spoon - 在没有严格编译的情况下为 CtCodeSnippetStatement 构建 Spoon CtElements
有没有办法在不完全编译的情况下为 CtCodeSnippetStatement 构建 CtElement?我有一些片段我希望能够扫描和进一步处理,然后再将它们插入到具有其余依赖项(片段可能引用的方法/全局变量)的类中。
soot - wala 和 soot 和有什么不一样?
我需要为 Java 中的以下任务选择一个框架:
- 提取控制流图
- 过程间和过程内分析
- 数据流分析
- PDG
- 不同的源代码分析任务(如方法体提取、测试代码提取)
哪个框架适合我的任务?
我遇到了很多不同的工具,除了 wala、soot 以及 JavaParser、Spoon 等等。
我应该选择哪个框架?理想情况下,我想采用一种更易于使用的工具。此外,我的期望是,Java 工具的普及应该已经存在于所有这些任务中。还是我的理解有误?
如果有人请指点我不同的资源等,我将不胜感激。
java - 以编程方式将java代码添加到现有java文件的任何可能方法?
我有一个使用我创建的自定义 Maven 插件自动生成的接口和类文件。该插件将从 JSON 文件中读取必要的数据,并使用 Jenesis4Java(下面提供 Mojo 代码)为我创建一个 Java 文件。
要求- 我必须遍历已生成的文件并在该文件中添加新方法或代码。有什么方法可以从 Mojo 实现这一目标吗?看看下面生成的代码,所以我必须向它添加一个新的抽象方法。
我只能从头开始重新生成同一个文件,但不能添加到现有代码中。
生成了以下代码-
在 mojo 文件中,我编写了生成这个和另一个类文件的逻辑。(mojo指maven插件创建过程中的java文件)
Mojo 文件供参考-
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)代码 并且我在解析这个类时遇到了麻烦 这里有以下几行
当我运行分析并尝试解析语句方法时,我会CtExecutableReference
在findAll()
Docker中运行我的项目时获取值。在本地运行并且 具有非空值时this.valuesRepository.findAll().forEach(values::add)
null
getType()
getDeclaredType()
getType()
getDeclaredType()
解析其他项目中的其他类似代码块时会发生同样的问题。例如这里
this.betRepository.findAll()
带有null 的语句在 Docker 中运行时都为空,但在本地环境中正常getType
。getDeclaredType
同时以下代码在两种环境中都能很好地解析
并且语句betRepository.findByCustomerId()
解析正常,并且在 Docker 和 n 本地 Spring Boot 运行中都有必要的类型信息。
我仔细检查了本地测试 - 一切正常 - 当从 IDE 运行测试中的代码或从 IDE 启动 Spring Boot 项目并通过从 Web UI 调用服务来初始化分析时 - 它正常并且按预期工作。
但是当我构建 Docker 映像时 - 我的类型和声明类型都为空。
我正在使用以下代码运行 Spoon 分析
在运行 Launcher 之前,我尝试打印它的设置。这是我得到的
我在 Java8 上运行项目 - 在两种环境中(详情如下)。要构建 docker,我使用以下命令
我尝试切换到不同的 Docker 基础映像(openjdk \ alpine 等),但没有任何帮助。我试图排除上面列出的所有 java 运行选项(例如 -XXblabla)——也没有帮助。
为了了解可能出现的问题,我在应用程序启动时打印所有环境(包括 java)数据。
这里是为本地环境打印的
这是在Docker环境中打印的内容
任何帮助,将不胜感激
inria-spoon - 如何从编译单元获取所有导入语句?
我正在使用以下代码片段来识别编译单元中的所有导入语句
但是这个系列中缺少某些进口产品。这是正确的方法吗?我可以看到这被 ImportAnalzyer 类所取代,但不知道如何使用它。另外我正在使用以下代码来提取导入包名和类名。这是正确的方法吗?
任何帮助都感激不尽
inria-spoon - 如何为狙击模式打印实现 OutputType 过滤器
根据 JDTBasedSpoonCompiler 的代码片段,编译单元不考虑输出类型过滤器。
对于狙击模式打印,输出类型在内部配置为编译单元。我正在使用带有 Maven Launcher 的 Maven 项目,并且只对将修改后的编译单元输出到输出文件夹感兴趣。目前,所有输入文件也都填充在输出文件夹中,这是不正确的。
有什么方法可以实现过滤器?