如何在生成.class文件之前运行进程

问题描述 投票:1回答:1

我创建/更新/删除API的代码几乎相同,我试图用模板模型替换。

所以我在文本模板中定义了Controller代码,然后在Application启动时我试图将模板复制到我的项目目录中,并用实际值替换变量以生成具有相应类名的API。

然后当我需要进行更改时,我可以更改我的模板,而不是每个API都可以减少整体代码维护。复制功能正在运行,但它是在生成.class文件之后发生的。这意味着我的应用程序实际使用的代码总是一个版本落后于当前版本。

为了让我能够正确运行版本,我需要再次重新启动应用程序而不更改模板。这样,当前版本和以前的版本将是相同的,它似乎正常工作。

然而,从生产角度来看,这不是很方便。我尝试使用javax.tools。*来编译代码,但因为我在我的应用程序中使用了很多依赖项,所以它失败了,除非我可以一起编译我的项目(包括需要生成的文件)。

src\main\java\com\project\dao\model\User.java:3: error: package com.vividsolutions.jts.geom does not exist
import com.vividsolutions.jts.geom.Point;
                                  ^
src\main\java\com\project\dao\model\User.java:5: error: package javax.persistence does not exist
import javax.persistence.*;

是否有可能:

  1. 在生成.class文件之前创建文件,以便可以一起编译项目。如果模板有错误或提供了无效变量,则会抛出编译错误。
  2. 在应用程序完全可用之前自动执行应用程序。这样代码将启动并从模板生成文件。然后它将关闭。然后它将自动重新启动并识别新生成的文件,以便可以一起编译项目。
java compilation
1个回答
0
投票

您可以通过将依赖项分成两部分来实现。换句话说,模板生成器不应该依赖于它生成的类。

这意味着您不应在模板生成器代码中的任何位置导入模板生成的类。

编译完类后,使用Class.forName("path.to.my.generated.class.Getter");实例化生成的类。

这里的经验法则是:对于任何加载的类,首先加载所有声明的导入。要避免以这种方式加载依赖项,请使用Class.forName(),它在调用时加载类。

注意:遗漏了所有异常/错误处理。

class MyCodeGenerator {
    public void main(String[] args) {
        generateCode();
        Class getterClass = Class.forName("path.to.my.generated.class.Getter");
        Object getter = getterClass.newInstance();
        Method initMethod = getterClass.getMethod("init");
        initMethod.invoke(getter);
    }
}

class Getter {
    public void init() {
        ...
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.