将用户自定义的类标记为“插件”

时间:2014-07-26 08:48:19

标签: java api interface

我正在编写一个API,可以帮助其他人编写自定义"插件"我当前课程的课程。

这些插件类有三种可能的形式。

  • 扩展JPanel
  • 实施Paintable
  • 上述
  • 的组合

Paintable界面只是一种方法: paint(Graphics2D g)。 然后,我将创建这些加载类的新实例。如果发现该对象是JPanel(通过instanceof),则在JFrame上创建一个新按钮并让它打开此JPanel。 如果发现该对象是Paintable,请将其添加到ArrayList。

然而,有一个问题。我将使用URLClassLoader从不同的文件夹加载这些类。在这个文件夹中,会有一些扩展JPanel的类,它们意味着是插件,因此无意加载。

所以我的问题是:什么是提示用户注意"标记"他们的类作为插件?他们将如何标记"它?

请记住这些插件可以显示的三种可能性。只需创建一个名为 Plugin 的空类,扩展JPanel并将其扩展到所有插件,对于那些扩展JPanel的人来说似乎很浪费。

2 个答案:

答案 0 :(得分:1)

为要用作插件的类创建注释,例如像这样的东西:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyPlugin {

}

,让用户使用此批注注释插件,并检查一个类是否应该是这样的插件:

boolean isPlugin(Class<?> cl) {
    return cl.getAnnotation(MyPlugin.class) != null;
}

答案 1 :(得分:0)

您可以使用某种“标记接口”,即教导开发人员在其类中实现此接口。界面不需要包含方法。所以你可以轻松检查一个类是否是一个插件。通过在网上搜索“marker interface”,你会发现这个模式的一些例子,即使在JDK本身也是如此。

当你写下你的插件类扩展JPanel时,你非常接近我的建议。但是一个接口就足够了,没有必要为它提供一个类。

您甚至可以将界面Paintable定义为扩展插件界面。因此,在这种情况下,开发人员不会有任何额外的努力。

编辑:这是传统的做法,自Java的第一版发布以来一直有效。另一个答案中提到的“注释”解决方案是更新的解决方案,但对初学者来说也更难理解。