1

在 CI 中,可以通过让共享库实现以下接口来编写插件:

extern "C" int initialize(SomeArgument * state);
extern "C" int shutdown(SomeArgument * state);

显然这是一个非常高级的界面,但我认为它明白了这一点。我听说反射的一个很好的用途是编写插件,但是为什么这会比我这里的更好呢?使用这样的接口具有以下优点:

  • 更快(反射不快,查找方法和间接调用)
  • 内存(反射有内存开销)
  • 直截了当(插件的入口/出口点非常明显)

我只是错过了什么吗?

4

5 回答 5

0

我能想到的主要优点是您可以使用包含plugins在运行时动态加载的属性文件(通过反射)。

或者您可以扫描特定目录中的插件并(尝试)通过反射自动加载/实例化它们。

当然,这并不意味着这些插件不应该实现特定的接口。

于 2012-05-14T21:38:05.203 回答
0

我想没有明确的理由为什么应该在接口上使用反射,并且有很多理由使用接口而不是反射。我想这很清楚。

所有提供答案的人,谢谢!

于 2012-05-15T16:47:38.873 回答
0

考虑这个有用的插件接口:

public interface EntityAuditor {

    <T> void auditEntity(Class<T> clazz, T entity);

}

具有 T 必须是合法注释的 JPA @Entity 的约束,否则将引发运行时异常。创建某种您希望插件审核的系统中的每个实体都必须遵守的接口是不切实际的。您可以有某种“可审计实体”接口来返回插件所需的信息,但现在实体内部有关于如何以及什么被审计的实现和耦合!该插件的重点是将其抽象出来,并能够在更改实体的情况下更改审计方式/内容。

于 2012-05-14T22:04:53.177 回答
0
  1. 反射可用于读取类静态变量和调用类静态方法。读取类静态变量可用于获取有关插件的信息(如其版本号),而无需首先创建实例。调用类静态方法可用于将插件实现为单例。
  2. 如果插件不是单例,可以使用反射来调用接受参数的构造函数,而没有反射则只能调用无参数构造函数。
于 2012-05-15T07:15:31.873 回答
0

一种观点是,与您列出的“C”接口不同,插件可以很好地集成到 Eclipse 或 Visual Studio .NET 等 IDE 中。例如,在 IDE 中,该工具可以列出所有公共/公开的功能,包括参数。现在使用 OO 编程,接口更加复杂。如果插件与 IDE 配合得很好,那么界面就更容易理解了。

一些插件是基于 GUI 的并公开事件/侦听器,这比“C”接口更复杂。这一切有意义吗?

于 2012-05-14T22:15:49.990 回答