如何在没有任何共享API的情况下实现java插件系统?

时间:2014-10-27 18:51:05

标签: java api plugins introspection

要设置插件系统,我知道常见的方法是为每个插件创建一个API部分(比如一个jar)和一个实现部分。因此,如果插件A需要B,A必须知道B的API,遗憾的是,“在编译时”......

有没有办法通过删除它们之间的任何代码依赖关系来开发插件? 我们的想法是开发人员应该使用约定和文档,而不是代码。我知道这种方式更危险,不遵循java范例但是...我只是好奇:)欢迎任何解决方案(消息代理,钩子,内省,注释,反序列化......)

目前我看到的唯一解决方案是重新创建插件所依赖的所有类,并通过内省调用内部的真实对象......这是有效的。但它太丑了。

public class User { // user object in plugin A

  private Object realUserObject;        // User object from UserPlugin

  public User(Object realUserObject) {
    this.realUserObject = realUserObject;
  }

  public String getName() throws Exception {
    Method method = realUserObject.getClass().getMethod("getName");
    return (String) method.invoke(realUserObject);
  }

  public void setName(String name) throws Exception {
    Method method = realUserObject.getClass().getMethod("getName");
    method.invoke(realUserObject, name);
  }

}

在这种情况下,如果java编译器让我们调用未声明的方法,因为类有一个特殊的注释(它生成一种动态代理以拦截所有调用),这可能会很有趣。因此,唯一的开发人员任务是将外部对象绑定到其插件中非常简单且现有的对象。

1 个答案:

答案 0 :(得分:0)

您有很多选择:SOA,方面,解释语言块等......

Java是可编译的语言,这就是我们通常提供共享API的原因 - 支持这样的生态系统要简单得多。但是,您可以自由选择要解决任务的任何语言。

在这种情况下你真的需要java吗?