如果没有任何共享API,您将如何实现java插件系统?

如果没有任何共享API,您将如何实现java插件系统?,java,api,plugins,introspection,Java,Api,Plugins,Introspection,为了建立一个插件系统,我知道常用的方法是为每个插件创建一个API部分(比如说一个jar)和一个实现部分。因此,如果插件a需要B,a必须知道B的API,很遗憾,“在编译时” 有没有办法通过删除插件之间的任何代码依赖关系来开发插件? 其思想是开发人员应该使用约定和文档,而不是代码。我知道这种方式更危险,不遵循java范例,但是。。。我只是好奇:)欢迎任何解决方案(MessageBroker、钩子、内省、注释、反序列化…) 目前我看到的唯一解决方案是重新创建插件依赖的所有类,并使用内省调用内部的真实对

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

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

目前我看到的唯一解决方案是重新创建插件依赖的所有类,并使用内省调用内部的真实对象。。。这很有效。但是很难看

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编译器允许我们调用一个未声明的方法,这可能会很有趣,因为类得到了一个特殊的注释(该注释生成一种动态代理以拦截所有调用)。因此,开发人员唯一的任务是将外部对象绑定到插件中一个非常简单且现有的对象。

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

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


在这样的环境中,你真的需要java吗?

你已经一针见血了。如果你连一个公共接口都没有,那么知道要公开什么/call/etc需要特别的努力,并且会有未知的结果。我不知道这是一个好主意。在任何情况下,在Java中这样做都必须严重依赖于反射,这会使事情变得更糟。像Scala这样的其他语言也有对类型签名进行操作的方法,这可能是“未声明的方法”所能达到的最接近的程度——不过,不要这样做。