在没有从单独的 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();
接口的使用使该解决方案能够处理任何数据类型。
我正在 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();
接口的使用使该解决方案能够处理任何数据类型。