首页 > 解决方案 > 如何在 Java 中从另一个类创建和构造一个类

问题描述

是否可以创建一个类(从无到有)并从另一个类构造/编写他的内容?

例如,我有一堂课StartingClass。并使用我想创建的此类的方法ConstructClass(尚不存在)。在StartingClass方法内部,我想指定它的内容ConstructClass,比如它扩展的类、它的属性、它的方法。

我需要这样做,因为我需要从生成的类和未编组的 xml 数据中创建新类。

我想过编辑一个带有.java扩展名的文件,但它不是很干净。

标签: javaclassoopxsdunmarshalling

解决方案


使用 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 版可以轻松地做类似的事情,它将提供一些在运行时编译类的方法。您可以查看这篇文章以更好地理解。


推荐阅读