在没有从单独的 jar 库引用的情况下调用方法

Call a method without a reference to it from a separate jar library

我正在 Java 中编写一个库。库中的对象被主应用程序引用。

应用程序需要在其对象之一的特定点调用一种方法。 库对象想要在应用程序中使用参数调用此方法。

不想将应用程序对象作为参考传递给库对象,因为我希望它松散耦合并且应用程序对象特定于该应用程序。如果我将它作为 Object 数据类型传递,它将不会附加方法,因为没有强制转换就不是那种类型。

因为它们是独立的 jar,static 也不起作用,希望它再次松散耦合。

示例

应用程序 A 是 运行 并且已观看 class。在它自己的罐子里。

public class WatchedInApplication extends BaseRichBolt { 
// has a reference to the lib class
private WatcherInLibrary lib;
...
  public void invoke (string.. args) {
    // invoke this method from another jar reference as a API.
    // to replay some data.
    outputCollector.emit(args)
  }    
}

库B被应用程序A引用,它想在某个时刻调用应用程序A中的对象中的方法。这个库B也是另外一个jar,就是运行和监控Application A。

public class WatcherInLibrary {
  public void invokeApplicationsinvokeMethod() {
     // invoke the applications method invoke, but with no specific      reference to it
    // basically want to invoke the output collector.emit to replay tuples.
  } 

}

积分

我可以简单地将 outputcollector 或 BaseRichBolt 传递给库 class B。但我想保持松耦合。此外,这两个应用程序都引用了 Storm,这可能会导致未来出现问题,即使没有问题,如果我开始传递 outputcollector 或 BaseRichBolt,它也会与 Storm 紧密相关。

看评论就简单了。使用定义 invoke(args) 方法的接口。在 Bolt 对象上实现接口。然后可以传递它并且是通用的。然后从库方法中调用。

快速玩具示例,可以通过接口上的泛型进行改进。

WatchedApplication

public class WatchedInApplication implements Invoke {

  private WatcherInLibrary lib;

  public WatchedInApplication(WatcherInLibrary lib) {
    super();
    this.setLib(lib);
  }

  public WatcherInLibrary getLib() {
    return lib;
  }

  public void setLib(WatcherInLibrary lib) {
    this.lib = lib;
  }
  // where the method is implemented. 
  @Override
  public void invokeRemote(String data) {
    System.out.println("Method Invoked " + data.toString());
  }
}

WatcherLibrary

public class WatcherInLibrary {

  private Invoke obj;

  public void setWatchedApplication(Invoke object) {
    this.obj = object;
  }

  public void invokeRemoteObject() {
    this.obj.invokeRemote("data passed");
  }

}

接口解决

public interface Invoke {
  public void invokeRemote(String data);
}

示例主要

WatcherInLibrary lib = new WatcherInLibrary();
WatchedInApplication watched = new WatchedInApplication(lib);
lib.setWatchedApplication(watched);
lib.invokeRemoteObject();

接口的使用使该解决方案能够处理任何数据类型。