【问题标题】:How to create and construct a class from another class in Java如何在 Java 中从另一个类创建和构造一个类
【发布时间】:2020-02-14 13:13:27
【问题描述】:

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

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

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

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

【问题讨论】:

  • 看起来你想实现一个代码生成器。你看看一些java的模板引擎。
  • 也许是 Java 反射?让您在运行时检查类及其内部

标签: java class oop xsd unmarshalling


【解决方案1】:

可以使用 Java 动态生成类。 Javassist 是一种方法。 Cglib 是另一种方式;还有ASM,我相信还有更多。但是,我建议您重新考虑为什么需要这样做。不建议这样做,因为 Java 是一种静态语言。您确定它是最适合您的用例的吗?而且,动态类在很大程度上依赖于 Object 和反射的使用才能正常工作。

如果您知道您的类可能是什么样的,工厂模式之类的东西可以帮助您更多地处理 XML 文件。或者使用Object[]Map<Object, Object>

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-08
      • 1970-01-01
      • 2020-02-02
      • 2018-04-30
      • 1970-01-01
      • 1970-01-01
      • 2012-08-04
      相关资源
      最近更新 更多