java - 生成非常大的 Java 代码

标签 java code-generation javac stringtemplate-4

我需要将 CHM 文件中的 ~20k 内置函数和常量填充到列表中。首先,我尝试序列化它们的列表,但反序列化需要 1500 毫秒(对于快速完成代码来说太长了,即使在第一次命中也是如此)。

尝试使用 StringTemplate 生成代码,它会生成有效的代码。但它不会编译,因为“initEnums()方法超出了65536的大小限制”。 (我的 Eclipse 很快就死了)

生成的方法如下所示:

public XModelField[] initEnums() {
    return new XModelField[] {
        new XModelField("aName", "aType", ...),
        ...
        // About 4'000 more entries
    };
}

如果此限制仅限于源代码,我可以使用另一个库直接生成类文件(也许是 CodeModel)。如果可能的话,我想保留我的代码,而无需再次从头开始重写输出生成器。有什么建议吗?

最佳答案

我认为你应该重新考虑你的策略。相应地对数据结构和方法进行建模,而无需生成代码。 相反,要生成 4000 个常量的 Java 代码,请将数据存储在文件或数据库中,并编写一个简短的方法来在初始化时读取该数据,以用数据对象填充列表。

生成代码是一个强大的工具,但您应该谨慎使用它。我认为这对于您的用例来说甚至没有必要,但如果您认为有必要,那么您可以尝试将要生成的代码部分最小化到绝对最小值,以保持简单。通常,您可以将大量通用代码提取到抽象父类(super class)中,这样您只需为子类中的某些方法生成代码。并且为 4000 个常量生成代码确实没有必要。将数据保留为数据并动态地操作您的数据。

关于java - 生成非常大的 Java 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15645225/

相关文章:

java - 如何在不使用 javac 编译源代码的情况下运行注释处理器(Java 8 不能使用 Apt)

java - 关于一次处理中间操作?

java - tomcat重启后没有创建日志文件

java - 来自库类的 Android Class.forName

c# - 如何通过t4生成自定义类?

objective-c - 查看@synthesize为getter/setter生成的代码

java - 无法使用附加库/jar 文件、javac 类路径进行编译

java - 为什么这段代码可以在 Java 1.6 中编译,但不能在 Java 1.7 中编译?

java - 如何通过JSONArray获取API的数据

c++ - 如何查看由 gcc(任何风格)编译器为 C/C++ 程序生成的汇编代码?