Добавление данных в текстовый файл между уже существующими данными в 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

Другие вопросы по тегам