当前位置: 首页 > 面试题库 >

7000个参考的Java源重构

史超英
2023-03-14
问题内容

我需要更改整个代码库中使用的方法的签名。

具体来说,该方法void log(String)将采用两个附加参数(Class c, String methodName),调用者需要根据调用该方法的地方提供两个参数。我不能简单地通过null或类似。

为了了解范围,Eclipse找到了7,000个对该方法的引用,因此,如果我更改它,则整个项目都将失败。我需要几个星期才能手动修复它。

据我所知,Eclipse的Eclipse重构插件不能胜任该任务,但是我真的想实现它的自动化
那么,我该如何完成工作呢?


问题答案:

太好了,我可以复制我以前的答案,而我只需要编辑一点点:

我认为您需要做的是使用javaparser之类的源代码解析器来执行此操作。

对于每个Java源文件,将其解析为CompilationUnit,创建一个Visitor,可能使用ModifierVisitorAdapter作为基类,并重写(至少)visit(MethodCallExpr, arg)。然后将更改后的CompilationUnit写入新文件,然后进行比较。

我建议不要更改原始源文件,但是创建一个影子文件树可能是一个好主意(例如,旧文件:src/main/java/com/mycompany/MyClass.java,新文件src/main/refactored/com/mycompany/MyClass.java,这样您就可以区分整个目录)。



 类似资料:
  • 我试图理解方法引用在java中是如何工作的。乍一看,这很简单。但当涉及到这些事情时: Foo类中有一个方法: 在另一个类Bar中有这样一个方法: 并使用方法参考: 它符合并工作,但我不明白它如何匹配这个: 到BiFunction方法: ???

  • 问题内容: 我想将转换为。但是这个匿名类我使用关键字。 例如,我写了这个简单的模式: 和带有匿名类的此示例代码(使用this关键字): 但是当我将其转换为lambda表达式时: 我收到此编译错误: 编译错误是: 所以我的问题是:有没有办法引用“ lambda对象” ? 问题答案: 你不能在表达式中引用。的语义已更改为仅在lambda中引用周围类的实例。无法this从lambda内部引用表达式。 问

  • 光源组件定义了光源的类型,颜色,强度以及产生的阴影类型,在场景中加入光源能使模型渲染得更加立体。具体可参考 光照 章节。 点击 属性检查器 下面的 添加组件 按钮,然后从 渲染组件 中选择 Light,即可添加 Light 组件到节点上。 Light 属性 属性 功能说明 Type 支持的光源类型,包括 DIRECTIONAL(平行光)、POINT(点光源)、SPOT(聚光灯)和 AMBIENT

  • 问题内容: 我正在研究一个基于Java Swing的简单应用程序。我将如何获取和设置表单当前关注的文本字段/文本区域的文本? 我知道如何确定哪个组件具有焦点,但是我不知道如何获取组件的选定文本。我使用getFocusOwner(),但它返回一个Component,因此未实现getSelectedText()方法。我是否需要进行类型转换? 问题答案: 根据您的确切上下文,您可能考虑使用自定义Text

  • 问题内容: 我有一个问题。 我认为将int \ Integer作为Integer传递给函数并对该引用进行++应该会更改基础对象,但是在所有情况下输出均为0。这是为什么? 问题答案: 如其他答案所述,Java仅 按值调用 ,而运算符仅影响变量,而不影响对象。如果要模拟 按引用调用 ,则需要传递一个可变对象(如数组)并修改其元素。 Java API为此有一些专门的对象,例如(它还可以在多个线程上工作)

  • 问题内容: “重要的是要理解,引用变量的类型(而不是它所引用的对象的类型)决定了可以访问哪些成员。” 那句话你到底是什么意思?这仅限于继承概念吗?JVM如何处理它? 问题答案: 这意味着假设您具有: 的类型的 变量 是,但对象的类型是指是。这是变量类型,它决定了您可以执行的操作-因此您无法调用 编译器仅知道您在上调用方法,其中不包括。同样,重载方法仅针对您所知道的方法进行解析: