如何在Eclipse中的所有Java文件中添加一行

3

我不确定是否可能,但我有一个旧的Java应用程序项目,其中有1000多个Java文件。我正在尝试为该应用程序添加log4j支持,这需要我添加

public static Logger logger = Logger.getLogger(MyClass.class.getName());

在每个文件中添加该行。

有没有办法在eclipse中执行此操作。我尝试过source->format,但它不允许我添加这行。我需要打开每个文件并添加该行吗?


2
我猜你也需要添加导入语句,对吧?你可以尝试编写一个程序来遍历文件目录,打开每个 .java 文件,并为你添加它。 - Rob Watts
3
似乎这不是一个Java问题,而是编写一个shell脚本来插入必要的行。 - svz
是的,我还需要添加log4j导入,那将会很棒。 - Ashish
3
无论如何,您都需要为每个文件编写实际的日志记录,这将比添加记录器需要更长时间。那么,为什么不在添加日志记录时一并添加记录器呢? - Evan Knowles
@EvanKnowles,我考虑过这个问题,但是我在每个类中都有老式的自定义日志记录方法,它们具有特定的签名,我可以轻松地用logger.info()或logger.debug()进行查找和替换。 - Ashish
6个回答

6
你可以在Eclipse中使用模板,但在这种情况下,你需要编辑每个文件并添加它。
更新:
将以下内容保存在名为".xml"的文件中。
<?xml version="1.0" encoding="UTF-8" standalone="no"?><templates><template autoinsert="true" context="java-members" deleted="false" description="adds the logger statement" enabled="true" name="logger">public static Logger logger = Logger.getLogger(${enclosing_type}.class.getName());</template></templates>

按下CTRL + 3,输入“templates”,然后选择模板 - Java编辑器,如下所示。
导入菜单中的文件,如下所示。
现在进入任何一个文件,在类文件中键入“logger”,然后按CTRL + space,快速辅助将显示“logger”模板,如下所示。
您的日志记录语句将出现,并显示您正在编辑的类,如下所示。

模板只适用于新文件。这就是为什么我在检查是否需要编辑每个文件的原因。 - Ashish
不,不,你可以检查“模板”视图,例如你可能在Eclipse中使用了“syso”。 - ajduke

2
您可以通过编程实现。首先,过滤您所有的.java文件:
public class FileExtensionFilter implements FilenameFilter {
    private Set<String> filteredExtensions;
    public FileExtensionFilter() {
        filteredExtensions = new HashSet<String>();
    }
    @Override
    public boolean accept(File dir, String name) {
        boolean accept = true;
        for (String filteredExtension:filteredExtensions) {
            accept = accept && !name.endsWith(filteredExtension);
        }
        return accept;
    }
    public void addFilteredExtension(String extension) {
        filteredExtensions.add(extension);
    }
}

然后您可以使用递归方法查找文件:

public Set<String> searchFileBasedOnExtension(File file) {
    Set<String> extensions = new HashSet<String>();
    if (file.isDirectory()) {
        for (File f : file.listFiles(fileExtensionFilter)) {
            extensions.addAll(checkForExtensions(f));
        }
    } else {
        String extension = file.getName().substring(Math.max(file.getName().lastIndexOf('.'),0));
        extensions.add(extension);
        fileExtensionFilter.addFilteredExtension(extension);
    }
    return extensions;
}

然后根据您收到的设置,可以迭代它,读取文件以查找要添加"import"的位置和类名,并将其保存到变量中,以便替换每个文件,因为每个文件代表不同的类。

示例:

for (String s : setWithFileNames) {
 // Use BufferedReader to read the file, save the content in a String, then look inside the String the classname and the first import position.
 // Use bufferedWriter to re-write the file with the changes you made.
}

希望这能对您的需求有所帮助。最好的问候。

这会起作用。需要确保类名是文件名,大多数情况下都是这样,否则也要解析它。 - tgkprog

1
另一个建议是使用AspectJ。AspectJ是Java的扩展,允许您系统地将额外的功能编织到现有类中。您首先需要安装AJDT(AspectJ开发工具)。然后您需要创建一个像这样的Aspect:
aspect LoggingAspect {
  before (Object thiz) : execution(public * *(..)) && this(thiz) {
    Logger logger = Logger.getLogger(thiz.getClass().getName());
    logger.log("Something");
  }
}

上面的方面将记录您编译的类之一的公共方法的每次执行。您可以按许多方式进行微调。记录是AspectJ可以做的最简单的事情之一。走这条路的好处是,您可以通过注释掉4行轻松地从项目中启用/禁用记录。
主要AspectJ网站AspectJ编程指南是开始学习AspectJ的好地方。

1
打开每个文件并添加这行代码将会很繁琐。我不确定Eclipse是否有这样的功能。但我建议使用一个shell脚本或Java函数来完成。步骤如下:1.读取每个文件;2.查找第一个'{'字符;3.在下一行插入日志记录语句;4.您可以从文件名中获取类名。我知道这可能不是您最好的解决方案,但希望能对您有所帮助。

我不熟悉Shell脚本,所以我会使用Java函数。 - Ashish
2
你可以在日志记录语句中使用 this.getClass() 来避免需要解析类名。 - svz

1
如果您有notepad ++,您可以这样做。使用查找替换功能,使用正则表达式查找目录。
因此,以public class开头的行需要被替换为带有日志语句的另一行。

0

你可以运行下面的命令在特定行号上添加任何行,只需提供文件夹名称,它将搜索所有扩展名为.java的子文件夹,并在特定位置添加行:

find <Folder Path> -name "*.java" -exec sed -i '1i<Text: You want to add>' {} \;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接