Как создать файлы Java class / es динамически? - PullRequest
0 голосов
/ 22 мая 2018

Мне нужен способ запустить Java-метод для ex.createModule ("Login") и в качестве вывода иметь:

  1. Новая папка с именем mod_login
  2. Внутри mod_login файлы классов Java, созданные из шаблона

Если шаблон

class Name extends Blah implement Blah {

    private createdInt;

    private int getCreatedInt() {
        return createdInt;
    }

}

Взамен я хочу получить динамически созданный класс:

 class Login extends Blah implement Blah {

    private loginInt;

    private int getLoginInt() {
        return loginInt;
    }
}

Попытался изучить Groovy, чтобы сделать это, но не смог найти ничего полезного.

PS Это не должно происходить во время выполнения, это скорее помощник для создания экземпляров этих модулей с помощью всего одной кнопки, а не их ввода

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Рабочий пример, который вам поможет.

import java.io.File;
import java.io.FileWriter;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Arrays;

import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.StandardLocation;
import javax.tools.ToolProvider;

public class HelloWorld {

public static void main(String[] args) throws Exception {

    // create an empty source file
    File sourceFile = File.createTempFile("Hello", ".java");
    sourceFile.deleteOnExit();

    // generate the source code, using the source filename as the class name
    String classname = sourceFile.getName().split("\\.")[0];
    String sourceCode = "public class " + classname + "{ public void hello() { System.out.print(\"Hello world\");}}";

    // write the source code into the source file
    FileWriter writer = new FileWriter(sourceFile);
    writer.write(sourceCode);
    writer.close();

    // compile the source file
    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
    File parentDirectory = sourceFile.getParentFile();
    fileManager.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(parentDirectory));
    Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjectsFromFiles(Arrays.asList(sourceFile));
    compiler.getTask(null, fileManager, null, null, null, compilationUnits).call();
    fileManager.close();

    // load the compiled class
    URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { parentDirectory.toURI().toURL() });
    Class<?> helloClass = classLoader.loadClass(classname);

    // call a method on the loaded class
    Method helloMethod = helloClass.getDeclaredMethod("hello");
    helloMethod.invoke(helloClass.newInstance());
 }
}
0 голосов
/ 22 мая 2018

Вам просто нужно 2 переменные, определенные в методе, который динамически создает файлы.

className & propertyName

Теперь используйте их для создания файла с расширением .java и записи текста из вашего шаблона.как есть.Для логики генерации className и propertyName используйте переменные, которые у вас есть выше.

Если вы хотите создать более одного такого файла, возьмите className & propertyName в список и запустите forloop.

...