Добавление данных в текстовый файл между уже существующими данными в Java
Мне нужно добавить это класс или это метод в текстовом / 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");
}
}
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) {
}
}
Вы определенно можете использовать JavaParser для этого. Вы можете посетить дерево, чтобы найти все классы и методы (вы можете использовать посетитель для этого или просто начать с корня файла (CompilationUnit) и вызвать рекурсивно node.getChildrenNodes(). Когда вы найдете экземпляр ClassOrInterfaceDeclaration или MethodDeclaration, вы просто добавьте комментарий, используя метод node.setComment()
Теперь вы можете вывести файл (возвращаясь из AST обратно в исходный код), используя DumpVisitor или просто вызвать compilationUnit.toString()
Отказ от ответственности: я участник JavaParser
Поток бесплатно, чтобы задать другие вопросы здесь или открыть вопрос на GitHub. В настоящее время проект поддерживается по адресу https://github.com/javaparser/javaparser