0

我需要在类名或方法名之前添加这是一个类这是文本/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");
    }
}
4

2 回答 2

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) {
    }
}
于 2015-05-22T07:01:46.840 回答
0

您绝对可以使用 JavaParser 来做到这一点。您可以访问查找所有类和方法的树(您可以使用访问者来执行此操作,或者只是从文件的根目录 (CompilationUnit) 开始并递归调用 node.getChildrenNodes()。当您找到 ClassOrInterfaceDeclaration 或 MethodDeclaration 的实例时,您只需使用方法 node.setComment() 添加评论

现在您可以使用 DumpVisitor 转储文件(从 AST 返回到源代码),或者只调用 compilationUnit.toString()

免责声明:我是 JavaParser 贡献者

在这里免费提出其他问题或在 GitHub 上打开问题。该项目目前维护在https://github.com/javaparser/javaparser

于 2015-05-22T14:49:03.913 回答