我不确定这是否可能,但我有一个旧的 Java 应用程序项目,其中有 1000 多个 Java 文件。我正在尝试向需要我添加的应用程序添加 log4j 支持
public static Logger logger = Logger.getLogger(MyClass.class.getName());
在每个文件中。
有什么方法可以使用 eclipse 执行操作。我已经尝试过source->format
,但这不允许我添加该行。我是否必须打开每个文件并添加该行?
您可以在 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 Editor,如下所示
从右侧菜单导入文件,如下所示
现在转到您的任何文件并在您的类文件中键入“logger”并执行 CTRL+space ,快速帮助将向您显示“logger”模板,如下所示
并且您的日志记录语句将出现,您正在编辑的类如下所示
您可以以编程方式进行。从所有 .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;
}
然后根据你收到的集合,你可以迭代它,读取文件找到添加“导入”的位置,也找到类名,并将其保存到变量中以替换每个文件,因为每个文件代表一个不同的班级。
样本:
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.
}
希望它可以帮助您满足您的要求。此致。
打开每个文件并添加这一行将是乏味的。
我不确定 Eclipse 是否有这样的东西。
但我建议使用 shell 脚本或 Java 函数来执行此操作。
我知道这可能不是您的最佳解决方案。
希望这可以帮助。
如果你有记事本++,你可以做到。使用正则表达式对目录使用查找替换功能。
因此,以 开头的行public class
需要替换为该行,另一行以 log 语句替换。
另一个建议是使用 AspectJ。AspectJ 是对 Java 的扩展,它允许您系统地将额外的功能编织到现有的类中。您首先需要安装 AJDT(AspectJ 开发工具)。然后你需要像这样创建一个方面:
aspect LoggingAspect {
before (Object thiz) : execution(public * *(..)) && this(thiz) {
Logger logger = Logger.getLogger(thiz.getClass().getName());
logger.log("Something");
}
}
上述方面将记录您编译的类之一的公共方法的每次执行。您当然可以通过多种方式对此进行调整。记录是 AspectJ 可以做的最简单的事情之一。沿着这条路走下去的好处是,您可以通过注释掉 4 行来轻松地启用/禁用项目的日志记录。
AspectJ的主要网站。AspectJ 编程指南是开始使用 AspectJ 的好地方。
您可以运行以下命令在特定行号上添加任何行,只需提供文件夹名称,它将搜索文件扩展名为 .java 的所有子文件夹并在特定位置添加行:
find <Folder Path> -name "*.java" -exec sed -i '1i<Text: You want to add>' {} \;