Как создать и построить класс из другого класса в Java - PullRequest
1 голос
/ 14 февраля 2020

Можно ли создать класс (начиная с нуля) и создать / написать его содержимое из другого класса?

Например, я получил класс StartingClass. И с помощью методов этого класса я хочу создать ConstructClass (который еще не существует). Внутри StartingClass методов я хочу указать содержимое ConstructClass, например, класс, который он расширяет, его атрибуты, методы.

Мне нужно сделать это, потому что мне нужно создавать новые классы из сгенерированных классов и unmarshalled xml datas.

Я думал о редактировании файла с расширением .java, но он не очень чистый.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Используя JavaCompiler, вы можете создавать и компилировать во время выполнения. В следующем примере показано, как это сделать, и вы можете параметризовать создание файлов и папок, а также считывать содержимое одного существующего Java файла в качестве шаблона для вашего поколения.

import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;

public class StackOverFlowClassFileGenerationTest {
  public static void main(String[] args) throws IOException {
    FileOutputStream fos = new FileOutputStream("ClassGenerationTest.java");
    PrintStream ps = new PrintStream(fos);
    ps.println("public class ClassGenerationTest {\n");
    ps.println("\t\tpublic static void main(String[] args) {\n");
    ps.println("\t\t\t\tSystem.out.println(\"Testing the class generation at runtime\");\n");
    ps.println("\t\t}\n}\n");
    ps.close();
    fos.close();

    JavaCompiler javac = ToolProvider.getSystemJavaCompiler();
    String javacOpts[] = {"ClassGenerationTest.java"};
    if (javac.run(null, null, null,  javacOpts) != 0) {
      System.out.println("Error");
    } else {
      System.out.println("Success");
    }
  }
}

Возможно сделать что-то подобное легко, используя jOOR версия 0.9.8, которая предложит несколько методов для компиляции классов во время выполнения. Вы можете проверить это сообщение , чтобы лучше понять.

0 голосов
/ 14 февраля 2020

Можно генерировать классы динамически, используя Java. Javassist - это один из способов сделать это. Cglib - это другой способ; есть также ASM , и я уверен, что есть еще несколько. Однако я бы посоветовал вам переосмыслить, зачем вам это нужно. Делать это не рекомендуется, потому что Java является государственным языком c. Вы уверены, что это лучший вариант для вашего случая использования? А также, динамические c классы в значительной степени зависят от использования объекта и отражения для того, чтобы они работали.

Если у вас есть какое-либо представление о том, на что могут быть похожи ваши классы, вам может помочь нечто вроде фабричного шаблона. гораздо больше для обработки файлов XML. Или, возможно, используйте Object[] или Map<Object, Object>

Если необходимо, попробуйте поискать решения, похожие на Javassist или cglib.

...