java - 动态 Java 程序的 DLL?

标签 java dll

我目前正在开发一个 Java 项目,其中有一组数据,我希望以多种自定义格式输出这些数据。我为每种格式都有一个类,它获取原始数据并相应地进行转换。但是,一开始我只实现了其中的两种或三种格式,但希望以后可以添加更多格式,而无需对应用程序进行大规模重建。

我的想法是为每个格式类创建一个 DLL,然后让我的应用程序将要转换的数据传递给每个格式类。这样,我可以稍后创建一个 DLL 并让我的主应用程序访问它。 (我很乐意听取任何替代方法,因为在此之前用 C++/C# 完成此操作的人感觉是合乎逻辑的解决方案,但它可能不适用于 Java)

我的问题是,我完全不知道如何做到这一点 - 在 C++/C# 中,我可以用几行代码编写它,但我不确定它如何与 Java 一起工作。冒着问一个非常模糊的问题的风险,我该怎么做?

非常感谢您的回答,并将提供 cookies 和茶。 :)

提前致谢, 中号

编辑:抱歉,只是补充一下:我也不确定如何创建 DLL,对于这个项目来说,它必须是 Java,首先要被读取。谢谢。 :)

最佳答案

与其使用 DLL 本身,不如使用某种插件架构。

除非有必要,否则我不建议使用 DLL 的一个原因是将 Java 代码与 native 代码链接需要使用 Java Native Interface (JNI) 这可能需要比纯 Java 解决方案更多的努力。

一个相对简单的方法是使用 reflection Java 的能力。

根据所提供的信息,我可能会遵循以下思路:

  1. 定义输出格式的接口(interface)。
  2. 创建一个实现该接口(interface)的 Java 类。
  3. 可以从 classpath 获取类(class).
  4. 使用反射动态加载类。 (使用 Class.newInstance 方法可以从 ClassLoader 加载的 class 文件实例化对象。)

通过这些步骤,可以实现一个简单的插件,当需要支持新格式时不需要完全重建。


第一步:定义接口(interface)

假设我们最终得到如下界面:

public interface Outputter {
  public void write(Data d);
}

第二步:制作实现类

然后,我们将制作一个实现类。

public class TextOutputter {
  public void write(Data d) {
    // ... output data to text
  }
}

然后,编译上面的代码,我们将得到一个名为 TextOutputter.classclass 文件。

第 3 步:使类在类路径中可用

运行主应用程序时,我们需要在 classpath 中包含上述 TextOutputter.class .通常,人们会告诉 JVM 一个位置列表,将其视为类路径,并且应该包括上面的 class 文件。

完成后,我们应该能够使用反射加载上述类。

第四步:使用反射动态加载类

现在,当我们真正想要加载上面的类时,我们将执行如下操作:

// Note: We load the class by specifying the fully-qualified class name!
Class<?> clazz = Class.forName("TextOutputter");

// Then, we instantiate the class.
// Note that the following method will call the no-argument constructor.
Outputter outputter = clazz.newInstance();      

// Now, we can give data to the TextOutputter object that we loaded dynamically.
outputter.write(...);

Class.forName方法用于尝试从默认的 ClassLoader 中找到 TextOutputter 类。一旦我们获得类作为 Class表示,然后我们可以实例化该类的对象。

可以使用 Class.newInstance 来实例化对象方法。如果应使用无参数构造函数以外的其他东西,则必须获取类的 Constructor 以从那里继续实例化对象。

然后将通过反射实例化的对象放入 Outputter 变量中,因此可以在 TextOutputter 上调用 write 方法。

添加更多格式将需要上述过程,但更改完全限定的类名(例如对于 String,FQCN 是 java.lang.String)就足够了这是加载不同类所需的。


简而言之,这就是动态加载 class 文件并在您的应用程序中使用它所需要的。

(作为旁注,我并没有实际编译上面的代码,所以可能会有一些错误,但我希望我能说明它所需要的过程。)

关于java - 动态 Java 程序的 DLL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4606344/

相关文章:

c - LoadRunner:如何创建 DLL 以使用 "web_reg_save_param"函数

c# - 制作 Fortran dll 并从 C# 调用它

dll - 32 位 DLL 加载 64 位依赖项?

java - 第一次启动应用程序时,recyclerview 为空

java - 无法注册设备。错误 500

java - 无论日期如何,检查给定时间是否介于两次之间

java - 从 Jar 运行我的 java 项目

java - VisualVM 堆大小不遵循已用大小

c++ - 分析共享库中的重复代码链接

c++ - 在 Qt 应用程序中使用自定义 dll