如何在Java中从另一个类创建和构造一个类

如何在Java中从另一个类创建和构造一个类,java,class,oop,xsd,unmarshalling,Java,Class,Oop,Xsd,Unmarshalling,是否可以创建一个类(从零开始)并从另一个类构造/编写其内容 例如,我得到了一个类StartingClass。我想用这个类的方法创建ConstructClass(这个类还不存在)。在StartingClass方法中,我想指定ConstructClass的内容,比如它扩展的类、属性和方法 我之所以需要这样做,是因为我需要从生成的类和未编组的xml数据创建新的类 我曾考虑过用.java扩展名编辑一个文件,但它不是很干净。使用java动态生成类是可能的。这是一种方法。是另一种方式;还有很多,我相信还有一

是否可以创建一个类(从零开始)并从另一个类构造/编写其内容

例如,我得到了一个类
StartingClass
。我想用这个类的方法创建
ConstructClass
(这个类还不存在)。在
StartingClass
方法中,我想指定
ConstructClass
的内容,比如它扩展的类、属性和方法

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


我曾考虑过用
.java
扩展名编辑一个文件,但它不是很干净。

使用java动态生成类是可能的。这是一种方法。是另一种方式;还有很多,我相信还有一些。但是,我建议您重新思考为什么需要这样做。不建议这样做,因为Java是一种静态语言。您确定它是用于您的用例的最佳方案吗?而且,动态类在很大程度上依赖于对象和反射的使用,以便它们工作

如果您知道类可能是什么样的,那么类似工厂模式的东西可以帮助您更好地处理XML文件。或者可以使用
对象[]
映射


如果必须的话,请尝试研究Javassist或类似cglib的解决方案

可以使用Java动态生成类。这是一种方法。是另一种方式;还有很多,我相信还有一些。但是,我建议您重新思考为什么需要这样做。不建议这样做,因为Java是一种静态语言。您确定它是用于您的用例的最佳方案吗?而且,动态类在很大程度上依赖于对象和反射的使用,以便它们工作

如果您知道类可能是什么样的,那么类似工厂模式的东西可以帮助您更好地处理XML文件。或者可以使用
对象[]
映射


如果必须的话,请尝试研究Javassist或类似cglib的解决方案

使用Java编译器,您可以在运行时创建和编译。下面的示例演示了如何执行此操作,您可以参数化文件和文件夹的生成,还可以读取一个现有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");
    }
  }
}

使用版本0.9.8可以轻松地完成类似的操作,该版本将提供一些在运行时编译类的方法。您可以检查此项以便更好地理解。

使用Java编译器,您可以在运行时创建和编译。下面的示例演示了如何执行此操作,您可以参数化文件和文件夹的生成,还可以读取一个现有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");
    }
  }
}

使用版本0.9.8可以轻松地完成类似的操作,该版本将提供一些在运行时编译类的方法。您可以检查此项以便更好地理解。

看起来您想要实现一个代码生成器。您可以查看一些java模板引擎,也许是java反射?允许您在RuntimeLook上检查类及其内部,就像您想要实现代码生成器一样。您可以查看一些java模板引擎,也许是java反射?允许您在运行时检查类及其内部