【问题标题】:Parsing a Java class for replace解析 Java 类以进行替换
【发布时间】:2014-09-10 06:10:31
【问题描述】:

我必须全部替换掉​​ e.printStackTrace();与记录器。但是大约有2000个班级。我可以在 Eclipse 中替换所有内容,但我必须为所有类定义 Logger。您有什么建议的解决方案吗?

【问题讨论】:

  • 你可以自己编写 Search&Replace with java.it应该不会太复杂。
  • 但是如何为所有类定义 Logger。我们不知道我们可以定义哪条线
  • 清理一次后,考虑用其他东西替换 Eclipse 的默认 e.printStackTrace(),以防止它再次发生。见stackoverflow.com/questions/13275525/…

标签: java eclipse parsing


【解决方案1】:

除了执行CTRL+H 并找到所有e.printStackTrace(); 并替换它们之外,您还可以通过创建记录器工厂来采取另一种策略。

public class LoggingFactory {
    private static LoggingFactory instance;
    private Map<Class, Logger> loggers;

    public static synchronized LoggingFactory getInstance() {
        if(instance == null) {
            instance = new LoggingFactory();
        }
        return instance;
    }

    public static Logger getLogger(Class clazz) {
        synchronized (clazz) {
            if(getInstance().loggers.get(clazz) == null) {
                getInstance().loggers.put(clazz, Logger.getLogger(clazz.getName()));
            }
            return getInstance().loggers.get(clazz);
        }
    }
}

使用这个类,您可以对一些正则表达式进行全局搜索和替换,例如

([\w\d]+)\.printStackTrace\(\);

替换成

LoggingFactory.getLogger(this.getClass()).error($1);

执行此操作时,请确保仔细查看弹出窗口提供的选项并选中正则表达式复选框!


结果将是这样的

e2.printStackTrace(); 变为 LoggingFactory.getLogger(this.getClass()).error(e2);

现在这仍然会在已替换静态方法的地方留下一些错误,但您可以返回并手动修复这些错误。


编辑

我觉得这里有点愚蠢,但在再次查看这个问题后我意识到大多数日志 API 已经建立在工厂设计之上。如果您使用自定义 Logger 或者他们获取/创建 logger 的方法不足以进行正则表达式替换,上述答案仍然有效,并且可能会使您受益。

因此,如果您使用的是 log4j,您可以简单地用这个正则表达式代替而不使用 LoggingFactory:

org.apache.log4j.Logger.getLogger(this.getClass()).error($1);

【讨论】:

  • 我不明白 ([\w\d]+)\.printStackTrace();。但我已将所有内容替换为 e.printStackTrace();与 LoggingFactory.getLogger(this.getClass()).error(e2);
  • 感谢您的回答
  • @emreturka ([\w\d]+)\.printStackTrace() 是一个正则表达式,用于查找包含至少 1 个单词或数字后跟 .printStackStrace() 的任何单词或数字。单词和或数字也用括号括起来 () 表示它是一个捕获组。这意味着当您进行替换时,您可以引用在替换正则表达式中使用 $1 捕获的内容。这确保了变量被正确捕获和插入。 [\w\d]+ 并不完全包含 Java 变量名,但我认为它足以解决这个问题。之后可以手动解决任何错误。
【解决方案2】:

e.printStackTrace(); 替换为com.class.path.to.static.Logger.doLog(e);

【讨论】:

    【解决方案3】:

    如果这些其他回答都没有帮助,我可以给你另一个想法,它肯定会解决问题,但根据你的口味,它可能需要太多的准备工作。

    我对此类问题的最佳答案可以用一个词来概括:Emacs

    我使用 Eclipse 来完成我所有的日常编码任务,但每隔一段时间我就会遇到一个突变任务,它需要一个强大的脚本环境,该环境也能理解我正在操作的文件的语法。

    对于这样的问题,我可以很容易地看到记录键盘宏的潜力:

    我首先为我想要操作的事物准备一个搜索事件列表,在这种情况下,每个类中都有一行带有 printStackTrace 调用。

    1. 向后搜索类声明
    2. 将基类名称保存到剪贴板
    3. 向前搜索左大括号。
    4. 插入换行符。
    5. 插入“public static ....”,并粘贴到剪贴板中。
    6. 修改结果行,只要它适用于所有事件。
    7. 保存文件。
    8. 转到下一个搜索项。

    停止录制宏。现在重复宏 999999 次(它在输入结束时停止)。您现在已经定义了所有的 Logger 对象。

    找出正确的步骤有时可能很棘手,但一旦你习惯了这一点,你就可以进行一些惊人的质量变换。

    现在您可以对“printStackTrace()”调用进行全局替换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-07
      • 1970-01-01
      • 2011-09-15
      • 1970-01-01
      • 1970-01-01
      • 2012-01-22
      • 1970-01-01
      相关资源
      最近更新 更多