编译后将 类 添加到项目中

Add classes to project after compile time

我有一个可以包含很多模块的项目。每个模块都存储在一个 class 文件中。但是当我把软件交付给客户的时候,并不清楚他们以后需要哪些模块。

是否可以向我的客户提供 class NewClass,他可以在不更改现有程序代码的情况下从中调用方法?

他可以在字段中键入 class 的名称,这样程序就会知道要使用哪个 class。并且所有方法名称在所有添加的 classes.

中都是相同的

我想它可以与 Javassist 一起使用,但我没有找到好的教程。

我想从 NewClass 调用方法 m1()。

class NewClass implements MyModule {
  @Override
  public void m1() {
    // do something
  }
}

当然可以。您要查找的是 the reflection API.

例如:

String cName = askUserForClass();
assert cName.equals("com.foo.schreiber.PriceyModule");
Class<?> moduleClass = Class.forName(cName);
MyModule mm = (MyModule) moduleClass.getConstructor().newInstance();

现在您有了一个 MyModule 类型的变量。假设 m1MyModule 中并且 MyModule 在基本版本中(这就是你应该设置的方式),你可以只调用 m1

请注意,当然,com.foo.schreiber.PriceyModule 确实需要在 JVM 的 class 路径上才能工作。如果不是,这个答案将增加大约 3 页,以设置一个 class 加载器,设置加载亲子关系以便您共享 MyModule 定义,以及整个 lotta 代码以可靠地找到 jar 或任何可能是额外模块来源的东西。所以你知道。如果您可以确保它在 class 路径上,将会简单得多。只要在罐子里,就是这样。