有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

插件如何在Java中共享类的接口而不公开整个源代码(如.h文件)

我正在用Java构建一个基于插件的程序,我希望保持项目源代码封闭,但允许第三方开发人员创建插件。我使用的系统正在工作,但这仅仅是因为我(当然)可以完全访问源代码

基本上,插件继承自插件。java,它们可以使用ServerManager。java来执行某些关键功能。如何使用户能够看到这些类的接口(即,他们知道ServerManager有一个sendMessage()函数,插件类可以重写onMessage()函数),而无需向他们提供完整的源代码

来自Objective-C背景,我会使用。这些“接口”和的h文件。m源文件(私有)-然后我只提供源文件。h文件——显然,在Java中没有类似于文件的东西。h文件

提前感谢:)


共 (4) 个答案

  1. # 1 楼答案

    你可以在这里点类似的东西。包装一个开源接口,客户端将在他这边执行

    大多数JavaEE世界都是这样工作的。例如,您有一个像这样的接口定义http://jsr311.java.net/nonav/javadoc/index.html,并且有多个不同的供应商i设备。类似地,您的代码将有一个用于访问插件的接口

    Atlassian Confluence完成了一个类似的实现,其中产品是封闭源代码的,除非您拥有源代码的特定许可证,但插件开发是完全分离的:https://developer.atlassian.com/display/CONFDEV/Confluence+Plugin+Guide

  2. # 2 楼答案

    因为java有SPI服务提供者接口。这里有一个article

    该机制有一个接口,公开提供,最好在自己的库中

    (几个)实现者提供了一个jar,其中一个(或多个)实现类在META-INF下接口名为的文本文件中指定

    然后java有一个API来选择一个实现,或者列出所有实现

    这是一个相对简单和通用的机制,看看官方的javadoc。对于XML实现,使用它

  3. # 3 楼答案

    一种方法是创建一个接口,将其公开,并提供该接口的实现

    例如:

    interface Light{
        void turnOn();
        void turnO();
        void setBrightness(int newValue);
        void setTimer(int timeoutSeconds);
    }
    

    然后在私有文件中定义实际类:

    class MyLight implements Light {
        void turnOn() {
          // implementation
        }
        // etc..
    }
    

    您可以提供一个Factory类,为用户大量生产MyLight对象

  4. # 4 楼答案

    如果您希望任何人都看不到您的核心代码,那么您可以对所需的代码进行模糊处理,您希望向客户端公开以创建插件的部分可以从模糊处理中跳过