我需要在类名或方法名之前添加这是一个类或这是一个方法在text / java文件中(通过japa可以获得行号) ,我已经尝试了所有可能的情况,我可以尝试编辑带文件读取器/写入器的文本/ java文件(但它总是追加到最后,并希望上面的类/方法名称),pmd,japa(可以阅读,但无法找到选项)编辑)和随机访问文件界面(也可以编辑,但它不会追加覆盖字符)所以到目前为止没有任何帮助,有什么方法可以实现这一点,
代表。 原始源代码
import java.lang.*;
class test1{
public static void main(String[] args) {
System.out.println("hello world");
}
}
之后
import java.lang.*;
/*this is a class*/
class test1{
/*this is a method*/
public static void main(String[] args) {
System.out.println("hello world");
}
}
答案 0 :(得分:2)
您可以使用JavaParser并实现自己的ModifierVisitorAdapter
。在下面找到一个你可以开始的小片段。
import japa.parser.JavaParser;
import japa.parser.ParseException;
import japa.parser.ast.CompilationUnit;
import japa.parser.ast.Node;
import japa.parser.ast.body.ClassOrInterfaceDeclaration;
import japa.parser.ast.body.MethodDeclaration;
import japa.parser.ast.comments.BlockComment;
import japa.parser.ast.visitor.ModifierVisitorAdapter;
import java.io.File;
import java.io.IOException;
public class ModifierVisitorAdapterDemo {
public static void main(String[] args) throws IOException, ParseException {
File sourceFile = new File("Test.java");
CompilationUnit cu = JavaParser.parse(sourceFile);
cu.accept(new ModifierVisitor(), null);
// instead of printing it to stdout you can write it to a file
System.out.println("// enriched cource");
System.out.println(cu.toString());
// to save it into the original file
// this will overwrite the input file
Files.write(sourceFile.toPath(),
cu.toString().getBytes(Charset.defaultCharset()),
StandardOpenOption.TRUNCATE_EXISTING
);
}
private static class ModifierVisitor extends ModifierVisitorAdapter {
@Override
public Node visit(ClassOrInterfaceDeclaration n, Object arg) {
if (!n.isInterface()) {
n.setComment(new BlockComment(" this is a class "));
}
return super.visit(n, arg);
}
@Override
public Node visit(MethodDeclaration n, Object arg) {
n.setComment(new BlockComment(" this is a method "));
return super.visit(n, arg);
}
}
}
假设有以下输入文件Test.java
import java.lang.System;
class Test {
static class Foo {
}
static interface IFace {
}
public static void main(String... args) {
}
}
输出将是
// enriched cource
import java.lang.System;
/* this is a class */
class Test {
/* this is a class */
static class Foo {
}
static interface IFace {
}
/* this is a method */
public static void main(String... args) {
}
}
答案 1 :(得分:0)
你绝对可以使用JavaParser来做到这一点。您可以访问树查找所有类和方法(您可以使用访问者来执行此操作或仅从文件的根目录(CompilationUnit)开始并递归调用node.getChildrenNodes()。当您找到ClassOrInterfaceDeclaration或MethodDeclaration的实例时,您只需使用方法node.setComment()
添加注释现在您可以使用DumpVisitor转储文件(从AST返回源代码)或只调用compilationUnit.toString()
免责声明:我是JavaParser撰稿人
免费提供其他问题或在GitHub上打开问题。该项目目前维持在https://github.com/javaparser/javaparser